Search: Submit
_Z4treeB5cxx11i
./ass1.cpp
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include "ass1.h"
using namespace std;
4012d655 push %rbpvector<string> tree(int n) {
4012ef83 bd c4 fe ff ff 01 cmpl $0x1,-0x13c(%rbp) if (n == 1) {
4012fc48 8d 85 d0 fe ff ff lea -0x130(%rbp),%rax vector<string> to_return;
40130b48 8d 85 5f ff ff ff lea -0xa1(%rbp),%rax to_return.push_back("(.)");
40133548 8d 95 30 ff ff ff lea -0xd0(%rbp),%rdx
40134e48 8d 85 30 ff ff ff lea -0xd0(%rbp),%rax
40136c48 8d 95 d0 fe ff ff lea -0x130(%rbp),%rdx return to_return;
40138548 8d 85 d0 fe ff ff lea -0x130(%rbp),%rax vector<string> to_return;
}
40139948 8d 85 10 ff ff ff lea -0xf0(%rbp),%rax vector<string> strings;
4013a88b 85 c4 fe ff ff mov -0x13c(%rbp),%eax vector<string> prev_strings = tree(n - 1);
4013c2c7 45 ec 00 00 00 00 movl $0x0,-0x14(%rbp) for (int i = 0; i < prev_strings.size(); i++) {
4013c98b 45 ec mov -0x14(%rbp),%eax
4013cf48 8d 85 f0 fe ff ff lea -0x110(%rbp),%rax
4013de48 39 c3 cmp %rax,%rbx
4013ec8b 45 ec mov -0x14(%rbp),%eax strings.push_back("(" + prev_strings[i] + ".)");
40140748 8d 45 80 lea -0x80(%rbp),%rax
40141848 8d 85 60 ff ff ff lea -0xa0(%rbp),%rax
40143348 8d 95 60 ff ff ff lea -0xa0(%rbp),%rdx
40144c48 8d 85 60 ff ff ff lea -0xa0(%rbp),%rax
40145b48 8d 45 80 lea -0x80(%rbp),%rax
4014678b 45 ec mov -0x14(%rbp),%eax strings.push_back("(." + prev_strings[i] + ")");
40148248 8d 45 c0 lea -0x40(%rbp),%rax
40149348 8d 45 a0 lea -0x60(%rbp),%rax
4014ab48 8d 55 a0 lea -0x60(%rbp),%rdx
4014c148 8d 45 a0 lea -0x60(%rbp),%rax
4014cd48 8d 45 c0 lea -0x40(%rbp),%rax
4014d983 45 ec 01 addl $0x1,-0x14(%rbp) for (int i = 0; i < prev_strings.size(); i++) {
}
4014e248 8d 95 10 ff ff ff lea -0xf0(%rbp),%rdx return strings;
4014fb48 8d 85 f0 fe ff ff lea -0x110(%rbp),%rax vector<string> prev_strings = tree(n - 1);
}
40150a48 8d 85 10 ff ff ff lea -0xf0(%rbp),%rax vector<string> strings;
40152148 8d 85 30 ff ff ff lea -0xd0(%rbp),%rax to_return.push_back("(.)");
40153548 8d 85 5f ff ff ff lea -0xa1(%rbp),%rax
40154448 8d 85 d0 fe ff ff lea -0x130(%rbp),%rax vector<string> to_return;
40156148 8d 85 60 ff ff ff lea -0xa0(%rbp),%rax strings.push_back("(" + prev_strings[i] + ".)");
40157548 8d 45 80 lea -0x80(%rbp),%rax
40158648 8d 45 a0 lea -0x60(%rbp),%rax strings.push_back("(." + prev_strings[i] + ")");
40159748 8d 45 c0 lea -0x40(%rbp),%rax
4015a848 8d 85 f0 fe ff ff lea -0x110(%rbp),%rax vector<string> prev_strings = tree(n - 1);
}
4015bc48 8d 85 10 ff ff ff lea -0xf0(%rbp),%rax vector<string> strings;
4015d648 8b 85 c8 fe ff ff mov -0x138(%rbp),%rax}
main
4015e755 push %rbpint main() {
4015f0be 1f 30 40 00 mov $0x40301f,%esi cout << "Enter the number of nodes: ";
int n;
4015ff48 8d 45 e8 lea -0x18(%rbp),%rax cin >> n;
4016108b 55 e8 mov -0x18(%rbp),%edx vector<string> result = tree(n);
4016218b 45 ec mov -0x14(%rbp),%eax for(int i; i < result.size(); i++) {
40162748 8d 45 d0 lea -0x30(%rbp),%rax
40163348 39 c3 cmp %rax,%rbx
40163d8b 45 ec mov -0x14(%rbp),%eax cout << result[i] << endl;
40165fbe 60 10 40 00 mov $0x401060,%esi
40166c83 45 ec 01 addl $0x1,-0x14(%rbp) for(int i; i < result.size(); i++) {
}
401672bb 00 00 00 00 mov $0x0,%ebx return 0;
40167748 8d 45 d0 lea -0x30(%rbp),%rax vector<string> result = tree(n);
4016a148 83 c4 28 add $0x28,%rsp}
_Z41__static_initialization_and_destruction_0ii
4016a855 push %rbp
4016b683 7d fc 01 cmpl $0x1,-0x4(%rbp)
4016bc81 7d f8 ff ff 00 00 cmpl $0xffff,-0x8(%rbp)
/usr/include/c++/9/iostream
//\ Standard\ iostream\ objects\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 1997\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file include/iostream
* This is a Standard C++ Library header.
*/
//
//\ ISO\ C\ 14882:\ 27\.3\ \ Standard\ iostream\ objects
//
#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM _GLIBCXX_IOSTREAM 1 _GLIBCXX_IOSTREAM 1
#pragma GCC GCC system_header GCC system_header
#include <bits/c++config.h>
#include <ostream>
#include <istream>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @name Standard Stream Objects
*
* The <iostream> header declares the eight <em>standard stream
* objects</em>. For other declarations, see
* http://gcc\.gnu\.org/onlinedocs/libstdc/manual/io\.html
* and the @link iosfwd I/O forward declarations @endlink
*
* They are required by default to cooperate with the global C
* library's @c FILE streams, and to be available during program
* startup and termination. For more information, see the section of the
* manual linked to above.
*/
//@\{
extern istream cin; ///\ Linked\ to\ standard\ input
extern ostream cout; ///\ Linked\ to\ standard\ output
extern ostream cerr; ///\ Linked\ to\ standard\ error\ \(unbuffered\)
extern ostream clog; ///\ Linked\ to\ standard\ error\ \(buffered\)
#ifdef _GLIBCXX_USE_WCHAR_T
extern wistream wcin; ///\ Linked\ to\ standard\ input
extern wostream wcout; ///\ Linked\ to\ standard\ output
extern wostream wcerr; ///\ Linked\ to\ standard\ error\ \(unbuffered\)
extern wostream wclog; ///\ Linked\ to\ standard\ error\ \(buffered\)
#endif
//@\}
//\ For\ construction\ of\ filebuffers\ for\ cout,\ cin,\ cerr,\ clog\ et\.\ al\.
4016c5bf 39 63 40 00 mov $0x406339,%edi static ios_base::Init __ioinit;
./ass1.cpp
4016e390 nop }
_GLOBAL__sub_I__Z4treeB5cxx11i
4016e655 push %rbp
4016eabe ff ff 00 00 mov $0xffff,%esi
_ZnwmPv
4016fb55 push %rbp
/usr/include/c++/9/new
//\ The\ \-\*\-\ C\ \-\*\-\ dynamic\ memory\ management\ header\.
//\ Copyright\ \(C\)\ 1994\-2019\ Free\ Software\ Foundation,\ Inc\.
//\ This\ file\ is\ part\ of\ GCC\.
//
//\ GCC\ is\ free\ software;\ you\ can\ redistribute\ it\ and/or\ modify
//\ it\ under\ the\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by
//\ the\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\
//\ GCC\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file new
* This is a Standard C++ Library header.
*
* The header @c new defines several functions to manage dynamic memory and
* handling memory allocation errors; see
* http://gcc\.gnu\.org/onlinedocs/libstdc/18_support/howto\.html\#4\ for\ more\.
*/
#ifndef _NEW
#define _NEW
#pragma GCC GCC system_header GCC system_header
#include <bits/c++config.h>
#include <exception>
#pragma GCC GCC visibility GCC visibility push(default) GCC visibility push(default) GCC visibility GCC visibility push(default) GCC visibility push(default)
extern "C++" {
namespace std
{
/**
* @brief Exception possibly thrown by @c new.
* @ingroup exceptions
*
* @c bad_alloc (or classes derived from it) is used to report allocation
* errors from the throwing forms of @c new. */
class bad_alloc : public exception
{
public:
bad_alloc() throw() { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
bad_alloc(const bad_alloc&) = default;
bad_alloc& operator=(const bad_alloc&) = default;
#endif
//\ This\ declaration\ is\ not\ useless:
// http://gcc\.gnu\.org/onlinedocs/gcc\-3\.0\.2/gcc_6\.html\#SEC118
virtual ~bad_alloc() throw();
//\ See\ comment\ in\ eh_exception\.cc\.
virtual const char* what() const throw">throw();
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
class bad_array_new_length : public bad_alloc
{
public:
bad_array_new_length() throw() { }
//\ This\ declaration\ is\ not\ useless:
// http://gcc\.gnu\.org/onlinedocs/gcc\-3\.0\.2/gcc_6\.html\#SEC118
virtual ~bad_array_new_length() throw();
//\ See\ comment\ in\ eh_exception\.cc\.
virtual const char* what() const throw">throw();
};
#endif
#if __cpp_aligned_new
enum class align_val_t: size_t {};
#endif
struct nothrow_t
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
explicit nothrow_t() = default;
#endif
};
extern const nothrow_t nothrow;
/** If you write your own error handler to be called by @c new, it must
* be of this type. */
typedef void (*new_handler)();
///\ Takes\ a\ replacement\ handler\ as\ the\ argument,\ returns\ the
///\ previous\ handler\.
new_handler set_new_handler(new_handler) throw();
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
///\ Return\ the\ current\ new\ handler\.
new_handler get_new_handler() noexcept;
#endif
} //\ namespace\ std
//@\{
/** These are replaceable signatures:
* - normal single new and delete (no arguments, throw @c bad_alloc on error)
* - normal array new and delete (same)
* - @c nothrow single new and delete (take a @c nothrow argument, return
* @c NULL on error)
* - @c nothrow array new and delete (same)
*
* Placement new and delete signatures (take a memory address argument,
* does nothing) may not be replaced by a user's program.
*/
_GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc)
__attribute__((__externally_visible__));
void operator delete(void*) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#if __cpp_sized_deallocation
void operator delete(void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#endif
_GLIBCXX_NODISCARD void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__, __malloc__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__, __malloc__));
void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#if __cpp_aligned_new
_GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __malloc__));
void operator delete(void*, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete(void*, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __malloc__));
void operator delete[](void*, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete[](void*, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
#if __cpp_sized_deallocation
void operator delete(void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete[](void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
#endif // //\ __cpp_sized_deallocation //\ __cpp_sized_deallocation
#endif // //\ __cpp_aligned_new //\ __cpp_aligned_new
//\ Default\ placement\ versions\ of\ operator\ new\.
_GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
40170748 8b 45 f0 mov -0x10(%rbp),%rax{ return __p; }
//\ The\ \-\*\-\ C\ \-\*\-\ dynamic\ memory\ management\ header\.
//\ Copyright\ \(C\)\ 1994\-2019\ Free\ Software\ Foundation,\ Inc\.
//\ This\ file\ is\ part\ of\ GCC\.
//
//\ GCC\ is\ free\ software;\ you\ can\ redistribute\ it\ and/or\ modify
//\ it\ under\ the\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by
//\ the\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\
//\ GCC\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file new
* This is a Standard C++ Library header.
*
* The header @c new defines several functions to manage dynamic memory and
* handling memory allocation errors; see
* http://gcc\.gnu\.org/onlinedocs/libstdc/18_support/howto\.html\#4\ for\ more\.
*/
#ifndef _NEW
#define _NEW
#pragma GCC GCC system_header GCC system_header
#include <bits/c++config.h>
#include <exception>
#pragma GCC GCC visibility GCC visibility push(default) GCC visibility push(default) GCC visibility GCC visibility push(default) GCC visibility push(default)
extern "C++" {
namespace std
{
/**
* @brief Exception possibly thrown by @c new.
* @ingroup exceptions
*
* @c bad_alloc (or classes derived from it) is used to report allocation
* errors from the throwing forms of @c new. */
class bad_alloc : public exception
{
public:
bad_alloc() throw() { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
bad_alloc(const bad_alloc&) = default;
bad_alloc& operator=(const bad_alloc&) = default;
#endif
//\ This\ declaration\ is\ not\ useless:
// http://gcc\.gnu\.org/onlinedocs/gcc\-3\.0\.2/gcc_6\.html\#SEC118
virtual ~bad_alloc() throw();
//\ See\ comment\ in\ eh_exception\.cc\.
virtual const char* what() const throw">throw();
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
class bad_array_new_length : public bad_alloc
{
public:
bad_array_new_length() throw() { }
//\ This\ declaration\ is\ not\ useless:
// http://gcc\.gnu\.org/onlinedocs/gcc\-3\.0\.2/gcc_6\.html\#SEC118
virtual ~bad_array_new_length() throw();
//\ See\ comment\ in\ eh_exception\.cc\.
virtual const char* what() const throw">throw();
};
#endif
#if __cpp_aligned_new
enum class align_val_t: size_t {};
#endif
struct nothrow_t
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
explicit nothrow_t() = default;
#endif
};
extern const nothrow_t nothrow;
/** If you write your own error handler to be called by @c new, it must
* be of this type. */
typedef void (*new_handler)();
///\ Takes\ a\ replacement\ handler\ as\ the\ argument,\ returns\ the
///\ previous\ handler\.
new_handler set_new_handler(new_handler) throw();
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
///\ Return\ the\ current\ new\ handler\.
new_handler get_new_handler() noexcept;
#endif
} //\ namespace\ std
//@\{
/** These are replaceable signatures:
* - normal single new and delete (no arguments, throw @c bad_alloc on error)
* - normal array new and delete (same)
* - @c nothrow single new and delete (take a @c nothrow argument, return
* @c NULL on error)
* - @c nothrow array new and delete (same)
*
* Placement new and delete signatures (take a memory address argument,
* does nothing) may not be replaced by a user's program.
*/
_GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc)
__attribute__((__externally_visible__));
void operator delete(void*) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#if __cpp_sized_deallocation
void operator delete(void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#endif
_GLIBCXX_NODISCARD void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__, __malloc__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__, __malloc__));
void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
__attribute__((__externally_visible__));
#if __cpp_aligned_new
_GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __malloc__));
void operator delete(void*, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete(void*, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t)
__attribute__((__externally_visible__));
_GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __malloc__));
void operator delete[](void*, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete[](void*, std::align_val_t, const std::nothrow_t&)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
#if __cpp_sized_deallocation
void operator delete(void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
void operator delete[](void*, std::size_t, std::align_val_t)
_GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
#endif // //\ __cpp_sized_deallocation //\ __cpp_sized_deallocation
#endif // //\ __cpp_aligned_new //\ __cpp_aligned_new
//\ Default\ placement\ versions\ of\ operator\ new\.
_GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
40170b5d pop %rbp
_ZNSt11char_traitsIcE6lengthEPKc
/usr/include/c++/9/bits/char_traits.h
//\ Character\ Traits\ for\ use\ by\ standard\ string\ and\ iostream\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 1997\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/char_traits.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{string}
*/
//
//\ ISO\ C\ 14882:\ 21\ \ Strings\ library
//
#ifndef _CHAR_TRAITS_H
#define _CHAR_TRAITS_H _CHAR_TRAITS_H 1 _CHAR_TRAITS_H 1
#pragma GCC GCC system_header GCC system_header
#include <bits/stl_algobase.h> <bits/stl_algobase.h> // <bits/stl_algobase.h> // std::copy, <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> // std::copy, <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> // <bits/stl_algobase.h> // std::copy, <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> // std::copy, <bits/stl_algobase.h> //\ std::copy,\ std::fill_n <bits/stl_algobase.h> //\ std::copy,\ std::fill_n
#include <bits/postypes.h> <bits/postypes.h> // <bits/postypes.h> // For <bits/postypes.h> //\ For\ streampos <bits/postypes.h> //\ For\ streampos <bits/postypes.h> // For <bits/postypes.h> //\ For\ streampos <bits/postypes.h> //\ For\ streampos <bits/postypes.h> // <bits/postypes.h> // For <bits/postypes.h> //\ For\ streampos <bits/postypes.h> //\ For\ streampos <bits/postypes.h> // For <bits/postypes.h> //\ For\ streampos <bits/postypes.h> //\ For\ streampos
#include <cwchar> <cwchar> // <cwchar> // For <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // <cwchar> // For <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> // For WEOF, wmemmove, wmemset, <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\. <cwchar> //\ For\ WEOF,\ wmemmove,\ wmemset,\ etc\.
#ifndef _GLIBCXX_ALWAYS_INLINE
# define define _GLIBCXX_ALWAYS_INLINE define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __attribute__((__always_define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __)) define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __attribute__((__always_define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __)) define _GLIBCXX_ALWAYS_INLINE define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __attribute__((__always_define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __)) define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __attribute__((__always_define _GLIBCXX_ALWAYS_INLINE inline define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) __))
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @brief Mapping from character type to associated types.
*
* @note This is an implementation class for the generic version
* of char_traits. It defines int_type, off_type, pos_type, and
* state_type. By default these are unsigned long, streamoff,
* streampos, and mbstate_t. Users who need a different set of
* types, but who don't need to change the definitions of any function
* defined in char_traits, can specialize __gnu_cxx::_Char_types
* while leaving __gnu_cxx::char_traits alone. */
template<typename _CharT>
struct _Char_types
{
typedef unsigned long int_type;
typedef std::streampos pos_type;
typedef std::streamoff off_type;
typedef std::mbstate_t state_type;
};
/**
* @brief Base class used to implement std::char_traits.
*
* @note For any given actual character type, this definition is
* probably wrong. (Most of the member functions are likely to be
* right, but the int_type and state_type typedefs, and the eof()
* member function, are likely to be wrong.) The reason this class
* exists is so users can specialize it. Classes in namespace std
* may not be specialized for fundamental types, but classes in
* namespace __gnu_cxx may be.
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/strings\.html\#strings\.string\.character_types
* for advice on how to make use of this class for @a unusual character
* types. Also, check out include/ext/pod_char_traits.h.
*/
template<typename _CharT>
struct char_traits
{
typedef _CharT char_type;
typedef typename _Char_types&#60_CharT&#62::int_type int_type;
typedef typename _Char_types&#60_CharT&#62::pos_type pos_type;
typedef typename _Char_types&#60_CharT&#62::off_type off_type;
typedef typename _Char_types&#60_CharT&#62::state_type state_type;
static _GLIBCXX14_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2)
{ __c1 = __c2; }
static _GLIBCXX_CONSTEXPR bool
eq(const char_type& __c1, const char_type& __c2)
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR bool
lt(const char_type& __c1, const char_type& __c2)
{ return __c1 < __c2; }
static _GLIBCXX14_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
static _GLIBCXX14_CONSTEXPR std::size_t
length(const char_type* __s);
static _GLIBCXX14_CONSTEXPR const char_type*
find(const char_type* __s, std::size_t __n, const char_type& __a);
static char_type*
move(char_type* __s1, const char_type* __s2, std::size_t __n);
static char_type*
copy(char_type* __s1, const char_type* __s2, std::size_t __n);
static char_type*
assign(char_type* __s, std::size_t __n, char_type __a);
static _GLIBCXX_CONSTEXPR char_type
to_char_type(const int_type& __c)
{ return static_cast<char_type>(__c); }
static _GLIBCXX_CONSTEXPR int_type
to_int_type(const char_type& __c)
{ return static_cast<int_type>(__c); }
static _GLIBCXX_CONSTEXPR bool
eq_int_type(const int_type& __c1, const int_type& __c2)
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR int_type
eof()
{ return static_cast<int_type>(_GLIBCXX_STDIO_EOF); }
static _GLIBCXX_CONSTEXPR int_type
not_eof(const int_type& __c)
{ return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
};
template<typename _CharT>
_GLIBCXX14_CONSTEXPR int
char_traits&#60_CharT&#62::
compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
{
for (std::size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
template<typename _CharT>
_GLIBCXX14_CONSTEXPR std::size_t
char_traits&#60_CharT&#62::
length(const char_type* __p)
{
std::size_t __i = 0;
while (!eq(__p[__i], char_type()))
++__i;
return __i;
}
template<typename _CharT>
_GLIBCXX14_CONSTEXPR const typename char_traits&#60_CharT&#62::char_type*
char_traits&#60_CharT&#62::
find(const char_type* __s, std::size_t __n, const char_type& __a)
{
for (std::size_t __i = 0; __i < __n; ++__i)
if (eq(__s[__i], __a))
return __s + __i;
return 0;
}
template<typename _CharT>
typename char_traits&#60_CharT&#62::char_type*
char_traits&#60_CharT&#62::
move(char_type* __s1, const char_type* __s2, std::size_t __n)
{
if (__n == 0)
return __s1;
return static_cast<_CharT*>(__builtin_memmove(__s1, __s2,
__n * sizeof(char_type)));
}
template<typename _CharT>
typename char_traits&#60_CharT&#62::char_type*
char_traits&#60_CharT&#62::
copy(char_type* __s1, const char_type* __s2, std::size_t __n)
{
//\ NB:\ Inline\ std::copy\ so\ no\ recursive\ dependencies\.
std::copy(__s2, __s2 + __n, __s1);
return __s1;
}
template<typename _CharT>
typename char_traits&#60_CharT&#62::char_type*
char_traits&#60_CharT&#62::
assign(char_type* __s, std::size_t __n, char_type __a)
{
//\ NB:\ Inline\ std::fill_n\ so\ no\ recursive\ dependencies\.
std::fill_n(__s, __n, __a);
return __s;
}
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
#define __cpp_lib_constexpr_char_traits __cpp_lib_constexpr_char_traits 201611 __cpp_lib_constexpr_char_traits 201611
/**
* @brief Determine whether the characters of a NULL-terminated
* string are known at compile time.
* @param __s The string.
*
* Assumes that _CharT is a built-in character type.
*/
template<typename _CharT>
static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_string_p(const _CharT* __s)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
(void) __s;
//\ In\ constexpr\ contexts\ all\ strings\ should\ be\ constant\.
return __builtin_is_constant_evaluated();
#else
while (__builtin_constant_p(*__s) && *__s)
__s++;
return __builtin_constant_p(*__s);
#endif
}
/**
* @brief Determine whether the characters of a character array are
* known at compile time.
* @param __a The character array.
* @param __n Number of characters.
*
* Assumes that _CharT is a built-in character type.
*/
template<typename _CharT>
static _GLIBCXX_ALWAYS_INLINE constexpr bool
__constant_char_array_p(const _CharT* __a, size_t __n)
{
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
(void) __a;
(void) __n;
//\ In\ constexpr\ contexts\ all\ character\ arrays\ should\ be\ constant\.
return __builtin_is_constant_evaluated();
#else
size_t __i = 0;
while (__i < __n && __builtin_constant_p(__a[__i]))
__i++;
return __i == __n;
#endif
}
#endif
//\ 21\.1
/**
* @brief Basis for explicit traits specializations.
*
* @note For any given actual character type, this definition is
* probably wrong. Since this is just a thin wrapper around
* __gnu_cxx::char_traits, it is possible to achieve a more
* appropriate definition by specializing __gnu_cxx::char_traits.
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/strings\.html\#strings\.string\.character_types
* for advice on how to make use of this class for @a unusual character
* types. Also, check out include/ext/pod_char_traits.h.
*/
template<class _CharT>
struct char_traits : public __gnu_cxx::char_traits<_CharT>
{ };
///\ 21\.1\.3\.1\ \ char_traits\ specializations
template<>
struct char_traits<char>
{
typedef char char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ __c1 = __c2; }
static _GLIBCXX_CONSTEXPR bool
eq(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR bool
lt(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{
//\ LWG\ 467\.
return (static_cast<unsigned char>(__c1)
< static_cast<unsigned char>(__c2));
}
static _GLIBCXX17_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return 0;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__builtin_constant_p(__n)
&& __constant_char_array_p(__s1, __n)
&& __constant_char_array_p(__s2, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits&#60char_type&#62::compare(__s1, __s2, __n);
#endif
return __builtin_memcmp(__s1, __s2, __n);
}
static _GLIBCXX17_CONSTEXPR size_t
40170d55 push %rbp length(const char_type* __s)
{
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__constant_string_p(__s))
return __gnu_<span class="namespc">cxx</span>::char_traits&#60char_type&#62::length(__s);
#endif
40171548 8b 45 f8 mov -0x8(%rbp),%rax return __builtin_strlen(__s);
4017375d pop %rbp }
40173990 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12_Vector_implD1Ev
/usr/include/c++/9/bits/stl_vector.h
//\ Vector\ implementation\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_vector.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{vector}
*/
#ifndef _STL_VECTOR_H
#define _STL_VECTOR_H _STL_VECTOR_H 1 _STL_VECTOR_H 1
#include <bits/stl_iterator_base_funcs.h>
#include <bits/functexcept.h>
#include <bits/concept_check.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <initializer_list>
#endif
#include <debug/assertions.h>
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
extern "C" void
__sanitizer_annotate_contiguous_container(const void*, const void*,
const void*, const void*);
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
///\ See\ bits/stl_deque\.h's\ _Deque_base\ for\ an\ explanation\.
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Alloc&#62::template
rebind&#60_Tp&#62::other _Tp_alloc_type;
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Tp_alloc_type&#62::pointer
pointer;
struct _Vector_impl_data
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
_Vector_impl_data() _GLIBCXX_NOEXCEPT
: _M_start(), _M_finish(), _M_end_of_storage()
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_impl_data(_Vector_impl_data&& __x) noexcept
: _M_start(__x._M_start), _M_finish(__x._M_finish),
_M_end_of_storage(__x._M_end_of_storage)
{ __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
#endif
void
_M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
{
_M_start = __x._M_start;
_M_finish = __x._M_finish;
_M_end_of_storage = __x._M_end_of_storage;
}
void
_M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
{
//\ Do\ not\ use\ std::swap\(_M_start,\ __x\._M_start\),\ etc\ as\ it\ loses
//\ information\ used\ by\ TBAA\.
_Vector_impl_data __tmp;
__tmp._M_copy_data(*this);
_M_copy_data(__x);
__x._M_copy_data(__tmp);
}
};
40173a55 push %rbp struct _Vector_impl
//\ Vector\ implementation\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_vector.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{vector}
*/
#ifndef _STL_VECTOR_H
#define _STL_VECTOR_H _STL_VECTOR_H 1 _STL_VECTOR_H 1
#include <bits/stl_iterator_base_funcs.h>
#include <bits/functexcept.h>
#include <bits/concept_check.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <initializer_list>
#endif
#include <debug/assertions.h>
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
extern "C" void
__sanitizer_annotate_contiguous_container(const void*, const void*,
const void*, const void*);
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
///\ See\ bits/stl_deque\.h's\ _Deque_base\ for\ an\ explanation\.
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Alloc&#62::template
rebind&#60_Tp&#62::other _Tp_alloc_type;
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Tp_alloc_type&#62::pointer
pointer;
struct _Vector_impl_data
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
_Vector_impl_data() _GLIBCXX_NOEXCEPT
: _M_start(), _M_finish(), _M_end_of_storage()
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_impl_data(_Vector_impl_data&& __x) noexcept
: _M_start(__x._M_start), _M_finish(__x._M_finish),
_M_end_of_storage(__x._M_end_of_storage)
{ __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
#endif
void
_M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
{
_M_start = __x._M_start;
_M_finish = __x._M_finish;
_M_end_of_storage = __x._M_end_of_storage;
}
void
_M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
{
//\ Do\ not\ use\ std::swap\(_M_start,\ __x\._M_start\),\ etc\ as\ it\ loses
//\ information\ used\ by\ TBAA\.
_Vector_impl_data __tmp;
__tmp._M_copy_data(*this);
_M_copy_data(__x);
__x._M_copy_data(__tmp);
}
};
40174648 8b 45 f8 mov -0x8(%rbp),%rax
//\ Vector\ implementation\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_vector.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{vector}
*/
#ifndef _STL_VECTOR_H
#define _STL_VECTOR_H _STL_VECTOR_H 1 _STL_VECTOR_H 1
#include <bits/stl_iterator_base_funcs.h>
#include <bits/functexcept.h>
#include <bits/concept_check.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <initializer_list>
#endif
#include <debug/assertions.h>
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
extern "C" void
__sanitizer_annotate_contiguous_container(const void*, const void*,
const void*, const void*);
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
///\ See\ bits/stl_deque\.h's\ _Deque_base\ for\ an\ explanation\.
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Alloc&#62::template
rebind&#60_Tp&#62::other _Tp_alloc_type;
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Tp_alloc_type&#62::pointer
pointer;
struct _Vector_impl_data
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
_Vector_impl_data() _GLIBCXX_NOEXCEPT
: _M_start(), _M_finish(), _M_end_of_storage()
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_impl_data(_Vector_impl_data&& __x) noexcept
: _M_start(__x._M_start), _M_finish(__x._M_finish),
_M_end_of_storage(__x._M_end_of_storage)
{ __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
#endif
void
_M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
{
_M_start = __x._M_start;
_M_finish = __x._M_finish;
_M_end_of_storage = __x._M_end_of_storage;
}
void
_M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
{
//\ Do\ not\ use\ std::swap\(_M_start,\ __x\._M_start\),\ etc\ as\ it\ loses
//\ information\ used\ by\ TBAA\.
_Vector_impl_data __tmp;
__tmp._M_copy_data(*this);
_M_copy_data(__x);
__x._M_copy_data(__tmp);
}
};
40175590 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1Ev
: public _Tp_alloc_type, public _Vector_impl_data
{
_Vector_impl() _GLIBCXX_NOEXCEPT_IF(
is_nothrow_default_constructible&#60_Tp_alloc_type&#62::value)
: _Tp_alloc_type()
{ }
_Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(__a)
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Not\ defaulted,\ to\ enforce\ noexcept\(true\)\ even\ when
//\ !is_nothrow_move_constructible&\#60_Tp_alloc_type&\#62\.
_Vector_impl(_Vector_impl&& __x) noexcept
: _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
{ }
_Vector_impl(_Tp_alloc_type&& __a) noexcept
: _Tp_alloc_type(std::move(__a))
{ }
_Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
: _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
{ }
#endif
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
template<typename = _Tp_alloc_type>
struct _Asan
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
static void _S_shrink(_Vector_impl&, size_type) { }
static void _S_on_dealloc(_Vector_impl&) { }
typedef _Vector_impl& _Reinit;
struct _Grow
{
_Grow(_Vector_impl&, size_type) { }
void _M_grew(size_type) { }
};
};
//\ Enable\ ASan\ annotations\ for\ memory\ obtained\ from\ std::allocator\.
template<typename _Up>
struct _Asan<allocator<_Up> >
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
//\ Adjust\ ASan\ annotation\ for\ \[_M_start,\ _M_end_of_storage\)\ to
//\ mark\ end\ of\ valid\ region\ as\ __curr\ instead\ of\ __prev\.
static void
_S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
{
__sanitizer_annotate_contiguous_container(__impl._M_start,
__impl._M_end_of_storage, __prev, __curr);
}
static void
_S_grow(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
static void
_S_shrink(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
static void
_S_on_dealloc(_Vector_impl& __impl)
{
if (__impl._M_start)
_S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
}
//\ Used\ on\ reallocation\ to\ tell\ ASan\ unused\ capacity\ is\ invalid\.
struct _Reinit
{
explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
{
//\ Mark\ unused\ capacity\ as\ valid\ again\ before\ deallocating\ it\.
_S_on_dealloc(_M_impl);
}
~_Reinit()
{
//\ Mark\ unused\ capacity\ as\ invalid\ after\ reallocation\.
if (_M_impl._M_start)
_S_adjust(_M_impl, _M_impl._M_end_of_storage,
_M_impl._M_finish);
}
_Vector_impl& _M_impl;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Reinit(const _Reinit&) = delete;
_Reinit& operator=(const _Reinit&) = delete;
#endif
};
//\ Tell\ ASan\ when\ unused\ capacity\ is\ initialized\ to\ be\ valid\.
struct _Grow
{
_Grow(_Vector_impl& __impl, size_type __n)
: _M_impl(__impl), _M_n(__n)
{ _S_grow(_M_impl, __n); }
~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
void _M_grew(size_type __n) { _M_n -= __n; }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Grow(const _Grow&) = delete;
_Grow& operator=(const _Grow&) = delete;
#endif
private:
_Vector_impl& _M_impl;
size_type _M_n;
};
};
#define _GLIBCXX_ASAN_ANNOTATE_REINIT _GLIBCXX_ASAN_ANNOTATE_REINIT \ _GLIBCXX_ASAN_ANNOTATE_REINIT \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Reinit const \
__attribute__((__unused__)) __reinit_guard(this->_M_impl)
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n) _GLIBCXX_ASAN_ANNOTATE_GROW(n) \ _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Grow \
__attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \ _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_shrink(this-&#62_M_<span class="namespc">impl</span>, n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \ _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_on_dealloc(this-&#62_M_<span class="namespc">impl</span>)
#else // // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\)
#define _GLIBCXX_ASAN_ANNOTATE_REINIT
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
#endif // // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR
};
public:
typedef _Alloc allocator_type;
_Tp_alloc_type&
_M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
const _Tp_alloc_type&
_M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
allocator_type
get_allocator() const _GLIBCXX_NOEXCEPT
{ return allocator_type(_M_get_Tp_allocator()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40175655 push %rbp _Vector_base() = default;
: public _Tp_alloc_type, public _Vector_impl_data
{
_Vector_impl() _GLIBCXX_NOEXCEPT_IF(
is_nothrow_default_constructible&#60_Tp_alloc_type&#62::value)
: _Tp_alloc_type()
{ }
_Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(__a)
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Not\ defaulted,\ to\ enforce\ noexcept\(true\)\ even\ when
//\ !is_nothrow_move_constructible&\#60_Tp_alloc_type&\#62\.
_Vector_impl(_Vector_impl&& __x) noexcept
: _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
{ }
_Vector_impl(_Tp_alloc_type&& __a) noexcept
: _Tp_alloc_type(std::move(__a))
{ }
_Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
: _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
{ }
#endif
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
template<typename = _Tp_alloc_type>
struct _Asan
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
static void _S_shrink(_Vector_impl&, size_type) { }
static void _S_on_dealloc(_Vector_impl&) { }
typedef _Vector_impl& _Reinit;
struct _Grow
{
_Grow(_Vector_impl&, size_type) { }
void _M_grew(size_type) { }
};
};
//\ Enable\ ASan\ annotations\ for\ memory\ obtained\ from\ std::allocator\.
template<typename _Up>
struct _Asan<allocator<_Up> >
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
//\ Adjust\ ASan\ annotation\ for\ \[_M_start,\ _M_end_of_storage\)\ to
//\ mark\ end\ of\ valid\ region\ as\ __curr\ instead\ of\ __prev\.
static void
_S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
{
__sanitizer_annotate_contiguous_container(__impl._M_start,
__impl._M_end_of_storage, __prev, __curr);
}
static void
_S_grow(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
static void
_S_shrink(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
static void
_S_on_dealloc(_Vector_impl& __impl)
{
if (__impl._M_start)
_S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
}
//\ Used\ on\ reallocation\ to\ tell\ ASan\ unused\ capacity\ is\ invalid\.
struct _Reinit
{
explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
{
//\ Mark\ unused\ capacity\ as\ valid\ again\ before\ deallocating\ it\.
_S_on_dealloc(_M_impl);
}
~_Reinit()
{
//\ Mark\ unused\ capacity\ as\ invalid\ after\ reallocation\.
if (_M_impl._M_start)
_S_adjust(_M_impl, _M_impl._M_end_of_storage,
_M_impl._M_finish);
}
_Vector_impl& _M_impl;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Reinit(const _Reinit&) = delete;
_Reinit& operator=(const _Reinit&) = delete;
#endif
};
//\ Tell\ ASan\ when\ unused\ capacity\ is\ initialized\ to\ be\ valid\.
struct _Grow
{
_Grow(_Vector_impl& __impl, size_type __n)
: _M_impl(__impl), _M_n(__n)
{ _S_grow(_M_impl, __n); }
~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
void _M_grew(size_type __n) { _M_n -= __n; }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Grow(const _Grow&) = delete;
_Grow& operator=(const _Grow&) = delete;
#endif
private:
_Vector_impl& _M_impl;
size_type _M_n;
};
};
#define _GLIBCXX_ASAN_ANNOTATE_REINIT _GLIBCXX_ASAN_ANNOTATE_REINIT \ _GLIBCXX_ASAN_ANNOTATE_REINIT \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Reinit const \
__attribute__((__unused__)) __reinit_guard(this->_M_impl)
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n) _GLIBCXX_ASAN_ANNOTATE_GROW(n) \ _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Grow \
__attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \ _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_shrink(this-&#62_M_<span class="namespc">impl</span>, n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \ _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_on_dealloc(this-&#62_M_<span class="namespc">impl</span>)
#else // // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\)
#define _GLIBCXX_ASAN_ANNOTATE_REINIT
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
#endif // // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR
};
public:
typedef _Alloc allocator_type;
_Tp_alloc_type&
_M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
const _Tp_alloc_type&
_M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
allocator_type
get_allocator() const _GLIBCXX_NOEXCEPT
{ return allocator_type(_M_get_Tp_allocator()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40176248 8b 45 f8 mov -0x8(%rbp),%rax
: public _Tp_alloc_type, public _Vector_impl_data
{
_Vector_impl() _GLIBCXX_NOEXCEPT_IF(
is_nothrow_default_constructible&#60_Tp_alloc_type&#62::value)
: _Tp_alloc_type()
{ }
_Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(__a)
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Not\ defaulted,\ to\ enforce\ noexcept\(true\)\ even\ when
//\ !is_nothrow_move_constructible&\#60_Tp_alloc_type&\#62\.
_Vector_impl(_Vector_impl&& __x) noexcept
: _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
{ }
_Vector_impl(_Tp_alloc_type&& __a) noexcept
: _Tp_alloc_type(std::move(__a))
{ }
_Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
: _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
{ }
#endif
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
template<typename = _Tp_alloc_type>
struct _Asan
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
static void _S_shrink(_Vector_impl&, size_type) { }
static void _S_on_dealloc(_Vector_impl&) { }
typedef _Vector_impl& _Reinit;
struct _Grow
{
_Grow(_Vector_impl&, size_type) { }
void _M_grew(size_type) { }
};
};
//\ Enable\ ASan\ annotations\ for\ memory\ obtained\ from\ std::allocator\.
template<typename _Up>
struct _Asan<allocator<_Up> >
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
//\ Adjust\ ASan\ annotation\ for\ \[_M_start,\ _M_end_of_storage\)\ to
//\ mark\ end\ of\ valid\ region\ as\ __curr\ instead\ of\ __prev\.
static void
_S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
{
__sanitizer_annotate_contiguous_container(__impl._M_start,
__impl._M_end_of_storage, __prev, __curr);
}
static void
_S_grow(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
static void
_S_shrink(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
static void
_S_on_dealloc(_Vector_impl& __impl)
{
if (__impl._M_start)
_S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
}
//\ Used\ on\ reallocation\ to\ tell\ ASan\ unused\ capacity\ is\ invalid\.
struct _Reinit
{
explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
{
//\ Mark\ unused\ capacity\ as\ valid\ again\ before\ deallocating\ it\.
_S_on_dealloc(_M_impl);
}
~_Reinit()
{
//\ Mark\ unused\ capacity\ as\ invalid\ after\ reallocation\.
if (_M_impl._M_start)
_S_adjust(_M_impl, _M_impl._M_end_of_storage,
_M_impl._M_finish);
}
_Vector_impl& _M_impl;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Reinit(const _Reinit&) = delete;
_Reinit& operator=(const _Reinit&) = delete;
#endif
};
//\ Tell\ ASan\ when\ unused\ capacity\ is\ initialized\ to\ be\ valid\.
struct _Grow
{
_Grow(_Vector_impl& __impl, size_type __n)
: _M_impl(__impl), _M_n(__n)
{ _S_grow(_M_impl, __n); }
~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
void _M_grew(size_type __n) { _M_n -= __n; }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Grow(const _Grow&) = delete;
_Grow& operator=(const _Grow&) = delete;
#endif
private:
_Vector_impl& _M_impl;
size_type _M_n;
};
};
#define _GLIBCXX_ASAN_ANNOTATE_REINIT _GLIBCXX_ASAN_ANNOTATE_REINIT \ _GLIBCXX_ASAN_ANNOTATE_REINIT \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Reinit const \
__attribute__((__unused__)) __reinit_guard(this->_M_impl)
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n) _GLIBCXX_ASAN_ANNOTATE_GROW(n) \ _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Grow \
__attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \ _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_shrink(this-&#62_M_<span class="namespc">impl</span>, n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \ _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_on_dealloc(this-&#62_M_<span class="namespc">impl</span>)
#else // // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\)
#define _GLIBCXX_ASAN_ANNOTATE_REINIT
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
#endif // // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR
};
public:
typedef _Alloc allocator_type;
_Tp_alloc_type&
_M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
const _Tp_alloc_type&
_M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
{ return this->_M_impl; }
allocator_type
get_allocator() const _GLIBCXX_NOEXCEPT
{ return allocator_type(_M_get_Tp_allocator()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40177190 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1Ev
#else
_Vector_base() { }
#endif
_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _M_impl(__a) { }
//\ Kept\ for\ ABI\ compatibility\.
#if !_GLIBCXX_INLINE_VERSION
_Vector_base(size_t __n)
: _M_impl()
{ _M_create_storage(__n); }
#endif
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_base(_Vector_base&&) = default;
//\ Kept\ for\ ABI\ compatibility\.
# if if !_GLIBCXX_INLINE_VERSION if !_GLIBCXX_INLINE_VERSION
_Vector_base(_Tp_alloc_type&& __a) noexcept
: _M_impl(std::move(__a)) { }
_Vector_base(_Vector_base&& __x, const allocator_type& __a)
: _M_impl(__a)
{
if (__x.get_allocator() == __a)
this->_M_impl._M_swap_data(__x._M_impl);
else
{
size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
_M_create_storage(__n);
}
}
# endif
_Vector_base(const allocator_type& __a, _Vector_base&& __x)
: _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
{ }
#endif
~_Vector_base() _GLIBCXX_NOEXCEPT
{
_M_deallocate(_M_impl._M_start,
_M_impl._M_end_of_storage - _M_impl._M_start);
}
public:
_Vector_impl _M_impl;
pointer
_M_allocate(size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
}
void
_M_deallocate(pointer __p, size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
if (__p)
_Tr::deallocate(_M_impl, __p, __n);
}
protected:
void
_M_create_storage(size_t __n)
{
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_finish = this->_M_impl._M_start;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
};
/**
* @brief A standard container which offers fixed time access to
* individual elements in any order.
*
* @ingroup sequences
*
* @tparam _Tp Type of element.
* @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>, including the
* <a href="tables.html#68">optional sequence requirements</a> with the
* %exception of @c push_front and @c pop_front.
*
* In some terminology a %vector can be described as a dynamic
* C-style array, it offers fast and efficient access to individual
* elements in any order and saves the user from worrying about
* memory and size allocation. Subscripting ( @c [] ) access is
* also provided as with C-style arrays.
*/
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ Concept\ requirements\.
typedef typename _Alloc::value_type _Alloc_value_type;
# if if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L &#60 if __cplusplus < 201103L
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
# endif
__glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>c<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>t<span class="namespc"></span>(<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>v<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
"std::vector must have a non-const, non-volatile value_type");
# ifdef ifdef __STRICT_ANSI__ ifdef __STRICT_ANSI__
static_assert(is_same&#60typename _<span class="namespc">Alloc</span>::value_type, _Tp&#62::value,
"std::vector must have the same value_type as its allocator");
# endif
#endif
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type;
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
static constexpr bool
_S_nothrow_relocate(true_type)
{
return noexcept(std::__relocate_a(std::declval<pointer>(),
std::declval<pointer>(),
std::declval<pointer>(),
std::declval<_Tp_alloc_type&>()));
}
static constexpr bool
_S_nothrow_relocate(false_type)
{ return false; }
static constexpr bool
_S_use_relocate()
{
//\ Instantiating\ std::__relocate_a\ might\ cause\ an\ error\ outside\ the
//\ immediate\ context\ \(in\ __relocate_object_a's\ noexcept\-specifier\),
//\ so\ only\ do\ it\ if\ we\ know\ the\ type\ can\ be\ move\-inserted\ into\ \*this\.
return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
}
static pointer
_S_do_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc, true_type) noexcept
{
return std::__relocate_a(__first, __last, __result, __alloc);
}
static pointer
_S_do_relocate(pointer, pointer, pointer __result,
_Tp_alloc_type&, false_type) noexcept
{ return __result; }
static pointer
_S_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc) noexcept
{
using __do_it = __bool_constant<_S_use_relocate()>
return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
}
#endif // //\ C11 //\ C11
protected:
using _Base::_M_allocate;
using _Base::_M_deallocate;
using _Base::_M_impl;
using _Base::_M_get_Tp_allocator;
public:
//\ \[23\.2\.4\.1\]\ construct/copy/destroy
//\ \(assign\(\)\ and\ get_allocator\(\)\ are\ also\ listed\ in\ this\ section\)
/**
* @brief Creates a %vector with no elements.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40177255 push %rbp vector() = default;
#else
_Vector_base() { }
#endif
_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _M_impl(__a) { }
//\ Kept\ for\ ABI\ compatibility\.
#if !_GLIBCXX_INLINE_VERSION
_Vector_base(size_t __n)
: _M_impl()
{ _M_create_storage(__n); }
#endif
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_base(_Vector_base&&) = default;
//\ Kept\ for\ ABI\ compatibility\.
# if if !_GLIBCXX_INLINE_VERSION if !_GLIBCXX_INLINE_VERSION
_Vector_base(_Tp_alloc_type&& __a) noexcept
: _M_impl(std::move(__a)) { }
_Vector_base(_Vector_base&& __x, const allocator_type& __a)
: _M_impl(__a)
{
if (__x.get_allocator() == __a)
this->_M_impl._M_swap_data(__x._M_impl);
else
{
size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
_M_create_storage(__n);
}
}
# endif
_Vector_base(const allocator_type& __a, _Vector_base&& __x)
: _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
{ }
#endif
~_Vector_base() _GLIBCXX_NOEXCEPT
{
_M_deallocate(_M_impl._M_start,
_M_impl._M_end_of_storage - _M_impl._M_start);
}
public:
_Vector_impl _M_impl;
pointer
_M_allocate(size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
}
void
_M_deallocate(pointer __p, size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
if (__p)
_Tr::deallocate(_M_impl, __p, __n);
}
protected:
void
_M_create_storage(size_t __n)
{
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_finish = this->_M_impl._M_start;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
};
/**
* @brief A standard container which offers fixed time access to
* individual elements in any order.
*
* @ingroup sequences
*
* @tparam _Tp Type of element.
* @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>, including the
* <a href="tables.html#68">optional sequence requirements</a> with the
* %exception of @c push_front and @c pop_front.
*
* In some terminology a %vector can be described as a dynamic
* C-style array, it offers fast and efficient access to individual
* elements in any order and saves the user from worrying about
* memory and size allocation. Subscripting ( @c [] ) access is
* also provided as with C-style arrays.
*/
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ Concept\ requirements\.
typedef typename _Alloc::value_type _Alloc_value_type;
# if if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L &#60 if __cplusplus < 201103L
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
# endif
__glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>c<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>t<span class="namespc"></span>(<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>v<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
"std::vector must have a non-const, non-volatile value_type");
# ifdef ifdef __STRICT_ANSI__ ifdef __STRICT_ANSI__
static_assert(is_same&#60typename _<span class="namespc">Alloc</span>::value_type, _Tp&#62::value,
"std::vector must have the same value_type as its allocator");
# endif
#endif
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type;
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
static constexpr bool
_S_nothrow_relocate(true_type)
{
return noexcept(std::__relocate_a(std::declval<pointer>(),
std::declval<pointer>(),
std::declval<pointer>(),
std::declval<_Tp_alloc_type&>()));
}
static constexpr bool
_S_nothrow_relocate(false_type)
{ return false; }
static constexpr bool
_S_use_relocate()
{
//\ Instantiating\ std::__relocate_a\ might\ cause\ an\ error\ outside\ the
//\ immediate\ context\ \(in\ __relocate_object_a's\ noexcept\-specifier\),
//\ so\ only\ do\ it\ if\ we\ know\ the\ type\ can\ be\ move\-inserted\ into\ \*this\.
return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
}
static pointer
_S_do_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc, true_type) noexcept
{
return std::__relocate_a(__first, __last, __result, __alloc);
}
static pointer
_S_do_relocate(pointer, pointer, pointer __result,
_Tp_alloc_type&, false_type) noexcept
{ return __result; }
static pointer
_S_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc) noexcept
{
using __do_it = __bool_constant<_S_use_relocate()>
return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
}
#endif // //\ C11 //\ C11
protected:
using _Base::_M_allocate;
using _Base::_M_deallocate;
using _Base::_M_impl;
using _Base::_M_get_Tp_allocator;
public:
//\ \[23\.2\.4\.1\]\ construct/copy/destroy
//\ \(assign\(\)\ and\ get_allocator\(\)\ are\ also\ listed\ in\ this\ section\)
/**
* @brief Creates a %vector with no elements.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40177e48 8b 45 f8 mov -0x8(%rbp),%rax
#else
_Vector_base() { }
#endif
_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _M_impl(__a) { }
//\ Kept\ for\ ABI\ compatibility\.
#if !_GLIBCXX_INLINE_VERSION
_Vector_base(size_t __n)
: _M_impl()
{ _M_create_storage(__n); }
#endif
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Vector_base(_Vector_base&&) = default;
//\ Kept\ for\ ABI\ compatibility\.
# if if !_GLIBCXX_INLINE_VERSION if !_GLIBCXX_INLINE_VERSION
_Vector_base(_Tp_alloc_type&& __a) noexcept
: _M_impl(std::move(__a)) { }
_Vector_base(_Vector_base&& __x, const allocator_type& __a)
: _M_impl(__a)
{
if (__x.get_allocator() == __a)
this->_M_impl._M_swap_data(__x._M_impl);
else
{
size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
_M_create_storage(__n);
}
}
# endif
_Vector_base(const allocator_type& __a, _Vector_base&& __x)
: _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
{ }
#endif
~_Vector_base() _GLIBCXX_NOEXCEPT
{
_M_deallocate(_M_impl._M_start,
_M_impl._M_end_of_storage - _M_impl._M_start);
}
public:
_Vector_impl _M_impl;
pointer
_M_allocate(size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
}
void
_M_deallocate(pointer __p, size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
if (__p)
_Tr::deallocate(_M_impl, __p, __n);
}
protected:
void
_M_create_storage(size_t __n)
{
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_finish = this->_M_impl._M_start;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
};
/**
* @brief A standard container which offers fixed time access to
* individual elements in any order.
*
* @ingroup sequences
*
* @tparam _Tp Type of element.
* @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>, including the
* <a href="tables.html#68">optional sequence requirements</a> with the
* %exception of @c push_front and @c pop_front.
*
* In some terminology a %vector can be described as a dynamic
* C-style array, it offers fast and efficient access to individual
* elements in any order and saves the user from worrying about
* memory and size allocation. Subscripting ( @c [] ) access is
* also provided as with C-style arrays.
*/
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ Concept\ requirements\.
typedef typename _Alloc::value_type _Alloc_value_type;
# if if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L &#60 if __cplusplus < 201103L
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
# endif
__glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>c<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>t<span class="namespc"></span>(<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>v<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
"std::vector must have a non-const, non-volatile value_type");
# ifdef ifdef __STRICT_ANSI__ ifdef __STRICT_ANSI__
static_assert(is_same&#60typename _<span class="namespc">Alloc</span>::value_type, _Tp&#62::value,
"std::vector must have the same value_type as its allocator");
# endif
#endif
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type;
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
static constexpr bool
_S_nothrow_relocate(true_type)
{
return noexcept(std::__relocate_a(std::declval<pointer>(),
std::declval<pointer>(),
std::declval<pointer>(),
std::declval<_Tp_alloc_type&>()));
}
static constexpr bool
_S_nothrow_relocate(false_type)
{ return false; }
static constexpr bool
_S_use_relocate()
{
//\ Instantiating\ std::__relocate_a\ might\ cause\ an\ error\ outside\ the
//\ immediate\ context\ \(in\ __relocate_object_a's\ noexcept\-specifier\),
//\ so\ only\ do\ it\ if\ we\ know\ the\ type\ can\ be\ move\-inserted\ into\ \*this\.
return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
}
static pointer
_S_do_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc, true_type) noexcept
{
return std::__relocate_a(__first, __last, __result, __alloc);
}
static pointer
_S_do_relocate(pointer, pointer, pointer __result,
_Tp_alloc_type&, false_type) noexcept
{ return __result; }
static pointer
_S_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc) noexcept
{
using __do_it = __bool_constant<_S_use_relocate()>
return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
}
#endif // //\ C11 //\ C11
protected:
using _Base::_M_allocate;
using _Base::_M_deallocate;
using _Base::_M_impl;
using _Base::_M_get_Tp_allocator;
public:
//\ \[23\.2\.4\.1\]\ construct/copy/destroy
//\ \(assign\(\)\ and\ get_allocator\(\)\ are\ also\ listed\ in\ this\ section\)
/**
* @brief Creates a %vector with no elements.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40178d90 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1EOS7_
#else
_Vector_base() { }
#endif
_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _M_impl(__a) { }
//\ Kept\ for\ ABI\ compatibility\.
#if !_GLIBCXX_INLINE_VERSION
_Vector_base(size_t __n)
: _M_impl()
{ _M_create_storage(__n); }
#endif
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40178e55 push %rbp _Vector_base(_Vector_base&&) = default;
#else
_Vector_base() { }
#endif
_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _M_impl(__a) { }
//\ Kept\ for\ ABI\ compatibility\.
#if !_GLIBCXX_INLINE_VERSION
_Vector_base(size_t __n)
: _M_impl()
{ _M_create_storage(__n); }
#endif
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{ _M_create_storage(__n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
40179e48 8b 45 f8 mov -0x8(%rbp),%rax
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEC1EOS7_
#else
vector() { }
#endif
/**
* @brief Creates a %vector with no elements.
* @param __a An allocator object.
*/
explicit
vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _Base(__a) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Creates a %vector with default constructed elements.
* @param __n The number of elements to initially create.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n default
* constructed elements.
*/
explicit
vector(size_type __n, const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_default_initialize(__n); }
/**
* @brief Creates a %vector with copies of an exemplar element.
* @param __n The number of elements to initially create.
* @param __value An element to copy.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n copies of @a __value.
*/
vector(size_type __n, const value_type& __value,
const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_fill_initialize(__n, __value); }
#else
/**
* @brief Creates a %vector with copies of an exemplar element.
* @param __n The number of elements to initially create.
* @param __value An element to copy.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n copies of @a __value.
*/
explicit
vector(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_fill_initialize(__n, __value); }
#endif
/**
* @brief %Vector copy constructor.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied
* (i.e. capacity() == size() in the new %vector).
*
* The newly-created %vector uses a copy of the allocator object used
* by @a __x (unless the allocator traits dictate a different object).
*/
vector(const vector& __x)
: _Base(__x.size(),
_Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
{
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__x.begin(), __x.end(),
this->_M_impl._M_start,
_M_get_Tp_allocator());
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move constructor.
*
* The newly-created %vector contains the exact contents of the
* moved instance.
* The contents of the moved instance are a valid, but unspecified
* %vector.
*/
4017b455 push %rbp vector(vector&&) noexcept = default;
#else
vector() { }
#endif
/**
* @brief Creates a %vector with no elements.
* @param __a An allocator object.
*/
explicit
vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
: _Base(__a) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Creates a %vector with default constructed elements.
* @param __n The number of elements to initially create.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n default
* constructed elements.
*/
explicit
vector(size_type __n, const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_default_initialize(__n); }
/**
* @brief Creates a %vector with copies of an exemplar element.
* @param __n The number of elements to initially create.
* @param __value An element to copy.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n copies of @a __value.
*/
vector(size_type __n, const value_type& __value,
const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_fill_initialize(__n, __value); }
#else
/**
* @brief Creates a %vector with copies of an exemplar element.
* @param __n The number of elements to initially create.
* @param __value An element to copy.
* @param __a An allocator.
*
* This constructor fills the %vector with @a __n copies of @a __value.
*/
explicit
vector(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(_S_check_init_len(__n, __a), __a)
{ _M_fill_initialize(__n, __value); }
#endif
/**
* @brief %Vector copy constructor.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied
* (i.e. capacity() == size() in the new %vector).
*
* The newly-created %vector uses a copy of the allocator object used
* by @a __x (unless the allocator traits dictate a different object).
*/
vector(const vector& __x)
: _Base(__x.size(),
_Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
{
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__x.begin(), __x.end(),
this->_M_impl._M_start,
_M_get_Tp_allocator());
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move constructor.
*
* The newly-created %vector contains the exact contents of the
* moved instance.
* The contents of the moved instance are a valid, but unspecified
* %vector.
*/
4017c448 8b 45 f8 mov -0x8(%rbp),%rax
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12_Vector_implC1Ev
: public _Tp_alloc_type, public _Vector_impl_data
{
4017da55 push %rbp _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
is_nothrow_default_constructible&#60_Tp_alloc_type&#62::value)
4017e648 8b 45 f8 mov -0x8(%rbp),%rax : _Tp_alloc_type()
4017fe90 nop { }
40180190 nop
_ZNSaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEED1Ev
/usr/include/c++/9/bits/allocator.h
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
allocator() _GLIBCXX_NOTHROW { }
_GLIBCXX20_CONSTEXPR
allocator(const allocator& __a) _GLIBCXX_NOTHROW
: __allocator_base<_Tp>(__a) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Avoid\ implicit\ deprecation\.
allocator& operator=(const allocator&) = default;
#endif
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
allocator(const allocator<_Tp1>&) _GLIBCXX_NOTHROW { }
40180255 push %rbp ~allocator() _GLIBCXX_NOTHROW { }
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
allocator() _GLIBCXX_NOTHROW { }
_GLIBCXX20_CONSTEXPR
allocator(const allocator& __a) _GLIBCXX_NOTHROW
: __allocator_base<_Tp>(__a) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Avoid\ implicit\ deprecation\.
allocator& operator=(const allocator&) = default;
#endif
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
allocator(const allocator<_Tp1>&) _GLIBCXX_NOTHROW { }
40180e48 8b 45 f8 mov -0x8(%rbp),%rax
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
allocator() _GLIBCXX_NOTHROW { }
_GLIBCXX20_CONSTEXPR
allocator(const allocator& __a) _GLIBCXX_NOTHROW
: __allocator_base<_Tp>(__a) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Avoid\ implicit\ deprecation\.
allocator& operator=(const allocator&) = default;
#endif
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
allocator(const allocator<_Tp1>&) _GLIBCXX_NOTHROW { }
40181d90 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EED1Ev
/usr/include/c++/9/bits/stl_vector.h
//\ Kept\ for\ ABI\ compatibility\.
# if if !_GLIBCXX_INLINE_VERSION if !_GLIBCXX_INLINE_VERSION
_Vector_base(_Tp_alloc_type&& __a) noexcept
: _M_impl(std::move(__a)) { }
_Vector_base(_Vector_base&& __x, const allocator_type& __a)
: _M_impl(__a)
{
if (__x.get_allocator() == __a)
this->_M_impl._M_swap_data(__x._M_impl);
else
{
size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
_M_create_storage(__n);
}
}
# endif
_Vector_base(const allocator_type& __a, _Vector_base&& __x)
: _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
{ }
#endif
40181e55 push %rbp ~_Vector_base() _GLIBCXX_NOEXCEPT
{
_M_deallocate(_M_impl._M_start,
40182a48 8b 45 f8 mov -0x8(%rbp),%rax _M_impl._M_end_of_storage - _M_impl._M_start);
{
_M_deallocate(_M_impl._M_start,
40183248 8b 45 f8 mov -0x8(%rbp),%rax
{
_M_deallocate(_M_impl._M_start,
40183948 29 c2 sub %rax,%rdx
{
40184348 89 c2 mov %rax,%rdx _M_deallocate(_M_impl._M_start,
40185c48 8b 45 f8 mov -0x8(%rbp),%rax }
40186b90 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EED1Ev
///\ Copy\ constructor\ with\ alternative\ allocator
vector(const vector& __x, const allocator_type& __a)
: _Base(__x.size(), __a)
{
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__x.begin(), __x.end(),
this->_M_impl._M_start,
_M_get_Tp_allocator());
}
private:
vector(vector&& __rv, const allocator_type& __m, true_type) noexcept
: _Base(__m, std::move(__rv))
{ }
vector(vector&& __rv, const allocator_type& __m, false_type)
: _Base(__m)
{
if (__rv.get_allocator() == __m)
this->_M_impl._M_swap_data(__rv._M_impl);
else if (!__rv.empty())
{
this->_M_create_storage(__rv.size());
this->_M_impl._M_finish =
std::__uninitialized_move_a(__rv.begin(), __rv.end(),
this->_M_impl._M_start,
_M_get_Tp_allocator());
__rv.clear();
}
}
public:
///\ Move\ constructor\ with\ alternative\ allocator
vector(vector&& __rv, const allocator_type& __m)
noexcept( noexcept(
vector(std::declval<vector&&>(), std::declval<const allocator_type&>(),
std::declval<typename _Alloc_traits::is_always_equal>())) )
: vector(std::move(__rv), __m, typename _Alloc_traits::is_always_equal{})
{ }
/**
* @brief Builds a %vector from an initializer list.
* @param __l An initializer_list.
* @param __a An allocator.
*
* Create a %vector consisting of copies of the elements in the
* initializer_list @a __l.
*
* This will call the element type's copy constructor N times
* (where N is @a __l.size()) and do no memory reallocation.
*/
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__a)
{
_M_range_initialize(__l.begin(), __l.end(),
random_access_iterator_tag());
}
#endif
/**
* @brief Builds a %vector from a range.
* @param __first An input iterator.
* @param __last An input iterator.
* @param __a An allocator.
*
* Create a %vector consisting of copies of the elements from
* [first,last).
*
* If the iterators are forward, bidirectional, or
* random-access, then this will call the elements' copy
* constructor N times (where N is distance(first,last)) and do
* no memory reallocation. But if only input iterators are
* used, then this will do at most 2N calls to the copy
* constructor, and logN memory reallocations.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
vector(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
: _Base(__a)
{
_M_range_initialize(__first, __last,
std::__iterator_category(__first));
}
#else
template<typename _InputIterator>
vector(_InputIterator __first, _InputIterator __last,
const allocator_type& __a = allocator_type())
: _Base(__a)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_initialize_dispatch(__first, __last, _Integral());
}
#endif
/**
* The dtor only erases the elements, and note that if the
* elements themselves are pointers, the pointed-to memory is
* not touched in any way. Managing the pointer is the user's
* responsibility.
*/
40186c55 push %rbp ~vector() _GLIBCXX_NOEXCEPT
{
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
40187848 8b 45 f8 mov -0x8(%rbp),%rax _M_get_Tp_allocator());
{
40188748 8b 45 f8 mov -0x8(%rbp),%rax std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC;
4018a148 8b 45 f8 mov -0x8(%rbp),%rax }
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backEOS5_
/**
* @brief %Vector assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied.
*
* Whether the allocator is copied depends on the allocator traits.
*/
vector&
operator=(const vector& __x);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* The contents of @a __x are moved into this %vector (without copying,
* if the allocators permit it).
* Afterwards @a __x is a valid, but unspecified %vector.
*
* Whether the allocator is moved depends on the allocator traits.
*/
vector&
operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
constexpr bool __move_storage =
_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal();
_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
return *this;
}
/**
* @brief %Vector list assignment operator.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
vector&
operator=(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
return *this;
}
#endif
/**
* @brief Assigns a given value to a %vector.
* @param __n Number of elements to be assigned.
* @param __val Value to be assigned.
*
* This function fills a %vector with @a __n copies of the given
* value. Note that the assignment completely changes the
* %vector and that the resulting %vector's size is the same as
* the number of elements assigned.
*/
void
assign(size_type __n, const value_type& __val)
{ _M_fill_assign(__n, __val); }
/**
* @brief Assigns a range to a %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function fills a %vector with copies of the elements in the
* range [__first,__last).
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
void
assign(_InputIterator __first, _InputIterator __last)
{ _M_assign_dispatch(__first, __last, __false_type()); }
#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Assigns an initializer list to a %vector.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
void
assign(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
}
#endif
///\ Get\ a\ copy\ of\ the\ memory\ allocation\ object\.
using _Base::get_allocator;
//\ iterators
/**
* Returns a read/write iterator that points to the first
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
begin() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_start); }
/**
* Returns a read-only (constant) iterator that points to the
* first element in the %vector. Iteration is done in ordinary
* element order.
*/
const_iterator
begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(this->_M_impl._M_start); }
/**
* Returns a read/write iterator that points one past the last
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
end() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_finish); }
/**
* Returns a read-only (constant) iterator that points one past
* the last element in the %vector. Iteration is done in
* ordinary element order.
*/
const_iterator
end() const _GLIBCXX_NOEXCEPT
{ return const_iterator(this->_M_impl._M_finish); }
/**
* Returns a read/write reverse iterator that points to the
* last element in the %vector. Iteration is done in reverse
* element order.
*/
reverse_iterator
rbegin() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last element in the %vector. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
rbegin() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(end()); }
/**
* Returns a read/write reverse iterator that points to one
* before the first element in the %vector. Iteration is done
* in reverse element order.
*/
reverse_iterator
rend() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(begin()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first element in the %vector. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
rend() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(begin()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read-only (constant) iterator that points to the
* first element in the %vector. Iteration is done in ordinary
* element order.
*/
const_iterator
cbegin() const noexcept
{ return const_iterator(this->_M_impl._M_start); }
/**
* Returns a read-only (constant) iterator that points one past
* the last element in the %vector. Iteration is done in
* ordinary element order.
*/
const_iterator
cend() const noexcept
{ return const_iterator(this->_M_impl._M_finish); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last element in the %vector. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
crbegin() const noexcept
{ return const_reverse_iterator(end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first element in the %vector. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
crend() const noexcept
{ return const_reverse_iterator(begin()); }
#endif
//\ \[23\.2\.4\.2\]\ capacity
/** Returns the number of elements in the %vector. */
size_type
size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
/** Returns the size() of the largest possible %vector. */
size_type
max_size() const _GLIBCXX_NOEXCEPT
{ return _S_max_size(_M_get_Tp_allocator()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* default constructed elements are appended.
*/
void
resize(size_type __new_size)
{
if (__new_size > size())
_M_default_append(__new_size - size());
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
* @param __x Data with which new elements should be populated.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* the %vector is extended and new elements are populated with
* given data.
*/
void
resize(size_type __new_size, const value_type& __x)
{
if (__new_size > size())
_M_fill_insert(end(), __new_size - size(), __x);
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
#else
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
* @param __x Data with which new elements should be populated.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* the %vector is extended and new elements are populated with
* given data.
*/
void
resize(size_type __new_size, value_type __x = value_type())
{
if (__new_size > size())
_M_fill_insert(end(), __new_size - size(), __x);
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/** A non-binding request to reduce capacity() to size(). */
void
shrink_to_fit()
{ _M_shrink_to_fit(); }
#endif
/**
* Returns the total number of elements that the %vector can
* hold before needing to allocate more memory.
*/
size_type
capacity() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_start); }
/**
* Returns true if the %vector is empty. (Thus begin() would
* equal end().)
*/
_GLIBCXX_NODISCARD bool
empty() const _GLIBCXX_NOEXCEPT
{ return begin() == end(); }
/**
* @brief Attempt to preallocate enough memory for specified number of
* elements.
* @param __n Number of elements required.
* @throw std::length_error If @a n exceeds @c max_size().
*
* This function attempts to reserve enough memory for the
* %vector to hold the specified number of elements. If the
* number requested is more than max_size(), length_error is
* thrown.
*
* The advantage of this function is that if optimal code is a
* necessity and the user can determine the number of elements
* that will be required, the user can reserve the memory in
* %advance, and thus prevent a possible reallocation of memory
* and copying of %vector data.
*/
void
reserve(size_type __n);
//\ element\ access
/**
* @brief Subscript access to the data contained in the %vector.
* @param __n The index of the element for which data should be
* accessed.
* @return Read/write reference to data.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
reference
operator[](size_type __n) _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_subscript(__n);
return *(this->_M_impl._M_start + __n);
}
/**
* @brief Subscript access to the data contained in the %vector.
* @param __n The index of the element for which data should be
* accessed.
* @return Read-only (constant) reference to data.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
const_reference
operator[](size_type __n) const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_subscript(__n);
return *(this->_M_impl._M_start + __n);
}
protected:
///\ Safety\ check\ used\ only\ from\ at\(\)\.
void
_M_range_check(size_type __n) const
{
if (__n >= this->size())
__throw_out_of_range_fmt(__N("vector::_M_range_check: __n "
"(which is %zu) >= this->size() "
"(which is %zu)"),
__n, this->size());
}
public:
/**
* @brief Provides access to the data contained in the %vector.
* @param __n The index of the element for which data should be
* accessed.
* @return Read/write reference to data.
* @throw std::out_of_range If @a __n is an invalid index.
*
* This function provides for safer data access. The parameter
* is first checked that it is in the range of the vector. The
* function throws out_of_range if the check fails.
*/
reference
at(size_type __n)
{
_M_range_check(__n);
return (*this)[__n];
}
/**
* @brief Provides access to the data contained in the %vector.
* @param __n The index of the element for which data should be
* accessed.
* @return Read-only (constant) reference to data.
* @throw std::out_of_range If @a __n is an invalid index.
*
* This function provides for safer data access. The parameter
* is first checked that it is in the range of the vector. The
* function throws out_of_range if the check fails.
*/
const_reference
at(size_type __n) const
{
_M_range_check(__n);
return (*this)[__n];
}
/**
* Returns a read/write reference to the data at the first
* element of the %vector.
*/
reference
front() _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_nonempty();
return *begin();
}
/**
* Returns a read-only (constant) reference to the data at the first
* element of the %vector.
*/
const_reference
front() const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_nonempty();
return *begin();
}
/**
* Returns a read/write reference to the data at the last
* element of the %vector.
*/
reference
back() _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_nonempty();
return *(end() - 1);
}
/**
* Returns a read-only (constant) reference to the data at the
* last element of the %vector.
*/
const_reference
back() const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_nonempty();
return *(end() - 1);
}
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 464\.\ Suggestion\ for\ new\ member\ functions\ in\ standard\ containers\.
//\ data\ access
/**
* Returns a pointer such that \[data(), data() + size()) is a valid
* range. For a non-empty %vector, data() == &front().
*/
_Tp*
data() _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); }
const _Tp*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data_ptr(this->_M_impl._M_start); }
//\ \[23\.2\.4\.3\]\ modifiers
/**
* @brief Add data to the end of the %vector.
* @param __x Data to be added.
*
* This is a typical stack operation. The function creates an
* element at the end of the %vector and assigns the given data
* to it. Due to the nature of a %vector this operation can be
* done in constant time if the %vector has preallocated space
* available.
*/
void
push_back(const value_type& __x)
{
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
__x);
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
_M_realloc_insert(end(), __x);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
void
4018b055 push %rbp push_back(value_type&& __x)
4018c048 8b 45 f0 mov -0x10(%rbp),%rax { emplace_back(std::move(__x)); }
4018cf48 8b 45 f8 mov -0x8(%rbp),%rax
4018de90 nop
4018e190 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12_Vector_implC1EOS8_
_Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
: _Tp_alloc_type(__a)
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Not\ defaulted,\ to\ enforce\ noexcept\(true\)\ even\ when
//\ !is_nothrow_move_constructible&\#60_Tp_alloc_type&\#62\.
4018e255 push %rbp _Vector_impl(_Vector_impl&& __x) noexcept
4018f348 8b 45 e0 mov -0x20(%rbp),%rax : _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
40190248 8b 45 e8 mov -0x18(%rbp),%rax
40191548 8b 45 e0 mov -0x20(%rbp),%rax
40192148 89 c6 mov %rax,%rsi
40192c90 nop { }
_ZNKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE4sizeEv
/**
* @brief %Vector assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied.
*
* Whether the allocator is copied depends on the allocator traits.
*/
vector&
operator=(const vector& __x);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* The contents of @a __x are moved into this %vector (without copying,
* if the allocators permit it).
* Afterwards @a __x is a valid, but unspecified %vector.
*
* Whether the allocator is moved depends on the allocator traits.
*/
vector&
operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
constexpr bool __move_storage =
_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal();
_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
return *this;
}
/**
* @brief %Vector list assignment operator.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
vector&
operator=(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
return *this;
}
#endif
/**
* @brief Assigns a given value to a %vector.
* @param __n Number of elements to be assigned.
* @param __val Value to be assigned.
*
* This function fills a %vector with @a __n copies of the given
* value. Note that the assignment completely changes the
* %vector and that the resulting %vector's size is the same as
* the number of elements assigned.
*/
void
assign(size_type __n, const value_type& __val)
{ _M_fill_assign(__n, __val); }
/**
* @brief Assigns a range to a %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function fills a %vector with copies of the elements in the
* range [__first,__last).
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
void
assign(_InputIterator __first, _InputIterator __last)
{ _M_assign_dispatch(__first, __last, __false_type()); }
#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Assigns an initializer list to a %vector.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
void
assign(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
}
#endif
///\ Get\ a\ copy\ of\ the\ memory\ allocation\ object\.
using _Base::get_allocator;
//\ iterators
/**
* Returns a read/write iterator that points to the first
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
begin() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_start); }
/**
* Returns a read-only (constant) iterator that points to the
* first element in the %vector. Iteration is done in ordinary
* element order.
*/
const_iterator
begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(this->_M_impl._M_start); }
/**
* Returns a read/write iterator that points one past the last
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
end() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_finish); }
/**
* Returns a read-only (constant) iterator that points one past
* the last element in the %vector. Iteration is done in
* ordinary element order.
*/
const_iterator
end() const _GLIBCXX_NOEXCEPT
{ return const_iterator(this->_M_impl._M_finish); }
/**
* Returns a read/write reverse iterator that points to the
* last element in the %vector. Iteration is done in reverse
* element order.
*/
reverse_iterator
rbegin() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last element in the %vector. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
rbegin() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(end()); }
/**
* Returns a read/write reverse iterator that points to one
* before the first element in the %vector. Iteration is done
* in reverse element order.
*/
reverse_iterator
rend() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(begin()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first element in the %vector. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
rend() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(begin()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read-only (constant) iterator that points to the
* first element in the %vector. Iteration is done in ordinary
* element order.
*/
const_iterator
cbegin() const noexcept
{ return const_iterator(this->_M_impl._M_start); }
/**
* Returns a read-only (constant) iterator that points one past
* the last element in the %vector. Iteration is done in
* ordinary element order.
*/
const_iterator
cend() const noexcept
{ return const_iterator(this->_M_impl._M_finish); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last element in the %vector. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
crbegin() const noexcept
{ return const_reverse_iterator(end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first element in the %vector. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
crend() const noexcept
{ return const_reverse_iterator(begin()); }
#endif
//\ \[23\.2\.4\.2\]\ capacity
/** Returns the number of elements in the %vector. */
size_type
40193455 push %rbp size() const _GLIBCXX_NOEXCEPT
40193c48 8b 45 f8 mov -0x8(%rbp),%rax { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
40194448 8b 45 f8 mov -0x8(%rbp),%rax
40194b48 29 c2 sub %rax,%rdx
4019555d pop %rbp
40195790 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EEixEm
/** Returns the size() of the largest possible %vector. */
size_type
max_size() const _GLIBCXX_NOEXCEPT
{ return _S_max_size(_M_get_Tp_allocator()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* default constructed elements are appended.
*/
void
resize(size_type __new_size)
{
if (__new_size > size())
_M_default_append(__new_size - size());
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
* @param __x Data with which new elements should be populated.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* the %vector is extended and new elements are populated with
* given data.
*/
void
resize(size_type __new_size, const value_type& __x)
{
if (__new_size > size())
_M_fill_insert(end(), __new_size - size(), __x);
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
#else
/**
* @brief Resizes the %vector to the specified number of elements.
* @param __new_size Number of elements the %vector should contain.
* @param __x Data with which new elements should be populated.
*
* This function will %resize the %vector to the specified
* number of elements. If the number is smaller than the
* %vector's current size the %vector is truncated, otherwise
* the %vector is extended and new elements are populated with
* given data.
*/
void
resize(size_type __new_size, value_type __x = value_type())
{
if (__new_size > size())
_M_fill_insert(end(), __new_size - size(), __x);
else if (__new_size < size())
_M_erase_at_end(this->_M_impl._M_start + __new_size);
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/** A non-binding request to reduce capacity() to size(). */
void
shrink_to_fit()
{ _M_shrink_to_fit(); }
#endif
/**
* Returns the total number of elements that the %vector can
* hold before needing to allocate more memory.
*/
size_type
capacity() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_start); }
/**
* Returns true if the %vector is empty. (Thus begin() would
* equal end().)
*/
_GLIBCXX_NODISCARD bool
empty() const _GLIBCXX_NOEXCEPT
{ return begin() == end(); }
/**
* @brief Attempt to preallocate enough memory for specified number of
* elements.
* @param __n Number of elements required.
* @throw std::length_error If @a n exceeds @c max_size().
*
* This function attempts to reserve enough memory for the
* %vector to hold the specified number of elements. If the
* number requested is more than max_size(), length_error is
* thrown.
*
* The advantage of this function is that if optimal code is a
* necessity and the user can determine the number of elements
* that will be required, the user can reserve the memory in
* %advance, and thus prevent a possible reallocation of memory
* and copying of %vector data.
*/
void
reserve(size_type __n);
//\ element\ access
/**
* @brief Subscript access to the data contained in the %vector.
* @param __n The index of the element for which data should be
* accessed.
* @return Read/write reference to data.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
reference
40195855 push %rbp operator[](size_type __n) _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_subscript(__n);
40196448 8b 45 f8 mov -0x8(%rbp),%rax return *(this->_M_impl._M_start + __n);
{
__glibcxx_requires_subscript(__n);
40196b48 8b 55 f0 mov -0x10(%rbp),%rdx
{
__glibcxx_requires_subscript(__n);
40197348 01 d0 add %rdx,%rax
4019765d pop %rbp }
_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_
/usr/include/c++/9/bits/basic_string.tcc
//\ Components\ for\ manipulating\ sequences\ of\ characters\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 1997\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/basic_string.tcc
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{string}
*/
//
//\ ISO\ C\ 14882:\ 21\ \ Strings\ library
//
//\ Written\ by\ Jason\ Merrill\ based\ upon\ the\ specification\ by\ Takanori\ Adachi
//\ in\ ANSI\ X3J16/94\-0013R2\.\ \ Rewritten\ by\ Nathan\ Myers\ to\ ISO\-14882\.
//\ Non\-reference\-counted\ implementation\ written\ by\ Paolo\ Carlini\ and
//\ updated\ by\ Jonathan\ Wakely\ for\ ISO\-14882\-2011\.
#ifndef _BASIC_STRING_TCC
#define _BASIC_STRING_TCC _BASIC_STRING_TCC 1 _BASIC_STRING_TCC 1
#pragma GCC GCC system_header GCC system_header
#include <bits/cxxabi_forced.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if _GLIBCXX_USE_CXX11_ABI
template<typename _CharT, typename _Traits, typename _Alloc>
const typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::npos;
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
swap(basic_string& __s) _GLIBCXX_NOEXCEPT
{
if (this == &__s)
return;
_Alloc_traits::_S_on_swap(_M_get_allocator(), __s._M_get_allocator());
if (_M_is_local())
if (__s._M_is_local())
{
if (length() && __s.length())
{
_CharT __tmp_data[_S_local_capacity + 1];
traits_type::copy(__tmp_data, __s._M_local_buf,
_S_local_capacity + 1);
traits_type::copy(__s._M_local_buf, _M_local_buf,
_S_local_capacity + 1);
traits_type::copy(_M_local_buf, __tmp_data,
_S_local_capacity + 1);
}
else if (__s.length())
{
traits_type::copy(_M_local_buf, __s._M_local_buf,
_S_local_capacity + 1);
_M_length(__s.length());
__s._M_set_length(0);
return;
}
else if (length())
{
traits_type::copy(__s._M_local_buf, _M_local_buf,
_S_local_capacity + 1);
__s._M_length(length());
_M_set_length(0);
return;
}
}
else
{
const size_type __tmp_capacity = __s._M_allocated_capacity;
traits_type::copy(__s._M_local_buf, _M_local_buf,
_S_local_capacity + 1);
_M_data(__s._M_data());
__s._M_data(__s._M_local_buf);
_M_capacity(__tmp_capacity);
}
else
{
const size_type __tmp_capacity = _M_allocated_capacity;
if (__s._M_is_local())
{
traits_type::copy(_M_local_buf, __s._M_local_buf,
_S_local_capacity + 1);
__s._M_data(_M_data());
_M_data(_M_local_buf);
}
else
{
pointer __tmp_ptr = _M_data();
_M_data(__s._M_data());
__s._M_data(__tmp_ptr);
_M_capacity(__s._M_allocated_capacity);
}
__s._M_capacity(__tmp_capacity);
}
const size_type __tmp_length = length();
_M_length(__s.length());
__s._M_length(__tmp_length);
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::pointer
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_create(size_type& __capacity, size_type __old_capacity)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 83\.\ \ String::npos\ vs\.\ string::max_size\(\)
if (__capacity > max_size())
std::__throw_length_error(__N("basic_string::_M_create"));
//\ The\ below\ implements\ an\ exponential\ growth\ policy,\ necessary\ to
//\ meet\ amortized\ linear\ time\ requirements\ of\ the\ library:\ see
// http://gcc\.gnu\.org/ml/libstdc/2001\-07/msg00085\.html\.
if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
{
__capacity = 2 * __old_capacity;
//\ Never\ allocate\ a\ string\ bigger\ than\ max_size\.
if (__capacity > max_size())
__capacity = max_size();
}
//\ NB:\ Need\ an\ array\ of\ char_type\[__capacity\],\ plus\ a\ terminating
//\ null\ char_type\(\)\ element\.
return _Alloc_traits::allocate(_M_get_allocator(), __capacity + 1);
}
//\ NB:\ This\ is\ the\ special\ case\ for\ Input\ Iterators,\ used\ in
//\ istreambuf_iterators,\ etc\.
//\ Input\ Iterators\ have\ a\ cost\ structure\ very\ different\ from
//\ pointers,\ calling\ for\ a\ different\ coding\ style\.
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InIterator>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_construct(_InIterator __beg, _InIterator __end,
std::input_iterator_tag)
{
size_type __len = 0;
size_type __capacity = size_type(_S_local_capacity);
while (__beg != __end && __len < __capacity)
{
_M_data()[__len++] = *__beg;
++__beg;
}
__try
{
while (__beg != __end)
{
if (__len == __capacity)
{
//\ Allocate\ more\ space\.
__capacity = __len + 1;
pointer __another = _M_create(__capacity, __len);
this->_S_copy(__another, _M_data(), __len);
_M_dispose();
_M_data(__another);
_M_capacity(__capacity);
}
_M_data()[__len++] = *__beg;
++__beg;
}
}
__catch(...)
{
_M_dispose();
__throw_exception_again;
}
_M_set_length(__len);
}
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InIterator>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_construct(_InIterator __beg, _InIterator __end,
std::forward_iterator_tag)
{
//\ NB:\ Not\ required,\ but\ considered\ best\ practice\.
if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
std::__throw_logic_error(__N("basic_string::"
"_M_construct null not valid"));
size_type __dnew = static_cast<size_type>(std::distance(__beg, __end));
if (__dnew > size_type(_S_local_capacity))
{
_M_data(_M_create(__dnew, size_type(0)));
_M_capacity(__dnew);
}
//\ Check\ for\ out_of_range\ and\ length_error\ exceptions\.
__try
{ this->_S_copy_chars(_M_data(), __beg, __end); }
__catch(...)
{
_M_dispose();
__throw_exception_again;
}
_M_set_length(__dnew);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_construct(size_type __n, _CharT __c)
{
if (__n > size_type(_S_local_capacity))
{
_M_data(_M_create(__n, size_type(0)));
_M_capacity(__n);
}
if (__n)
this->_S_assign(_M_data(), __n, __c);
_M_set_length(__n);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_assign(const basic_string& __str)
{
if (this != &__str)
{
const size_type __rsize = __str.length();
const size_type __capacity = capacity();
if (__rsize > __capacity)
{
size_type __new_capacity = __rsize;
pointer __tmp = _M_create(__new_capacity, __capacity);
_M_dispose();
_M_data(__tmp);
_M_capacity(__new_capacity);
}
if (__rsize)
this->_S_copy(_M_data(), __str._M_data(), __rsize);
_M_set_length(__rsize);
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
reserve(size_type __res)
{
//\ Make\ sure\ we\ don't\ shrink\ below\ the\ current\ size\.
if (__res < length())
__res = length();
const size_type __capacity = capacity();
if (__res != __capacity)
{
if (__res > __capacity
|| __res > size_type(_S_local_capacity))
{
pointer __tmp = _M_create(__res, __capacity);
this->_S_copy(__tmp, _M_data(), length() + 1);
_M_dispose();
_M_data(__tmp);
_M_capacity(__res);
}
else if (!_M_is_local())
{
this->_S_copy(_M_local_data(), _M_data(), length() + 1);
_M_destroy(__capacity);
_M_data(_M_local_data());
}
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
size_type __len2)
{
const size_type __how_much = length() - __pos - __len1;
size_type __new_capacity = length() + __len2 - __len1;
pointer __r = _M_create(__new_capacity, capacity());
if (__pos)
this->_S_copy(__r, _M_data(), __pos);
if (__s && __len2)
this->_S_copy(__r + __pos, __s, __len2);
if (__how_much)
this->_S_copy(__r + __pos + __len2,
_M_data() + __pos + __len1, __how_much);
_M_dispose();
_M_data(__r);
_M_capacity(__new_capacity);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_erase(size_type __pos, size_type __n)
{
const size_type __how_much = length() - __pos - __n;
if (__how_much && __n)
this->_S_move(_M_data() + __pos, _M_data() + __pos + __n, __how_much);
_M_set_length(length() - __n);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
resize(size_type __n, _CharT __c)
{
const size_type __size = this->size();
if (__size < __n)
this->append(__n - __size, __c);
else if (__n < __size)
this->_M_set_length(__n);
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_append(const _CharT* __s, size_type __n)
{
const size_type __len = __n + this->size();
if (__len <= this->capacity())
{
if (__n)
this->_S_copy(this->_M_data() + this->size(), __s, __n);
}
else
this->_M_mutate(this->size(), size_type(0), __s, __n);
this->_M_set_length(__len);
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InputIterator>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace_dispatch(const_iterator __i1, const_iterator __i2,
_InputIterator __k1, _InputIterator __k2,
std::__false_type)
{
const basic_string __s(__k1, __k2);
const size_type __n1 = __i2 - __i1;
return _M_replace(__i1 - begin(), __n1, __s._M_data(),
__s.size());
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
_CharT __c)
{
_M_check_length(__n1, __n2, "basic_string::_M_replace_aux");
const size_type __old_size = this->size();
const size_type __new_size = __old_size + __n2 - __n1;
if (__new_size <= this->capacity())
{
pointer __p = this->_M_data() + __pos1;
const size_type __how_much = __old_size - __pos1 - __n1;
if (__how_much && __n1 != __n2)
this->_S_move(__p + __n2, __p + __n1, __how_much);
}
else
this->_M_mutate(__pos1, __n1, 0, __n2);
if (__n2)
this->_S_assign(this->_M_data() + __pos1, __n2, __c);
this->_M_set_length(__new_size);
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace(size_type __pos, size_type __len1, const _CharT* __s,
const size_type __len2)
{
_M_check_length(__len1, __len2, "basic_string::_M_replace");
const size_type __old_size = this->size();
const size_type __new_size = __old_size + __len2 - __len1;
if (__new_size <= this->capacity())
{
pointer __p = this->_M_data() + __pos;
const size_type __how_much = __old_size - __pos - __len1;
if (_M_disjunct(__s))
{
if (__how_much && __len1 != __len2)
this->_S_move(__p + __len2, __p + __len1, __how_much);
if (__len2)
this->_S_copy(__p, __s, __len2);
}
else
{
//\ Work\ in\-place\.
if (__len2 && __len2 <= __len1)
this->_S_move(__p, __s, __len2);
if (__how_much && __len1 != __len2)
this->_S_move(__p + __len2, __p + __len1, __how_much);
if (__len2 > __len1)
{
if (__s + __len2 <= __p + __len1)
this->_S_move(__p, __s, __len2);
else if (__s >= __p + __len1)
this->_S_copy(__p, __s + __len2 - __len1, __len2);
else
{
const size_type __nleft = (__p + __len1) - __s;
this->_S_move(__p, __s, __nleft);
this->_S_copy(__p + __nleft, __p + __len2,
__len2 - __nleft);
}
}
}
}
else
this->_M_mutate(__pos, __len1, __s, __len2);
this->_M_set_length(__new_size);
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::
copy(_CharT* __s, size_type __n, size_type __pos) const
{
_M_check(__pos, "basic_string::copy");
__n = _M_limit(__pos, __n);
__glibcxx_requires_string_len(__s, __n);
if (__n)
_S_copy(__s, _M_data() + __pos, __n);
//\ 21\.3\.5\.7\ par\ 3:\ do\ not\ append\ null\.\ \ \(good\.\)
return __n;
}
#else // //\ !_GLIBCXX_USE_CXX11_ABI //\ !_GLIBCXX_USE_CXX11_ABI
template<typename _CharT, typename _Traits, typename _Alloc>
const typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::
_Rep::_S_max_size = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4;
template<typename _CharT, typename _Traits, typename _Alloc>
const _CharT
basic_string&#60_CharT, _Traits, _Alloc&#62::
_Rep::_S_terminal = _CharT();
template<typename _CharT, typename _Traits, typename _Alloc>
const typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::npos;
//\ Linker\ sets\ _S_empty_rep_storage\ to\ all\ 0s\ \(one\ reference,\ empty\ string\)
//\ at\ static\ init\ time\ \(before\ static\ ctors\ are\ run\)\.
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::_Rep::_S_empty_rep_storage[
(sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
sizeof(size_type)];
//\ NB:\ This\ is\ the\ special\ case\ for\ Input\ Iterators,\ used\ in
//\ istreambuf_iterators,\ etc\.
//\ Input\ Iterators\ have\ a\ cost\ structure\ very\ different\ from
//\ pointers,\ calling\ for\ a\ different\ coding\ style\.
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InIterator>
_CharT*
basic_string&#60_CharT, _Traits, _Alloc&#62::
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
input_iterator_tag)
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__beg == __end && __a == _Alloc())
return _S_empty_rep()._M_refdata();
#endif
//\ Avoid\ reallocation\ for\ common\ case\.
_CharT __buf[128];
size_type __len = 0;
while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT))
{
__buf[__len++] = *__beg;
++__beg;
}
_Rep* __r = _Rep::_S_create(__len, size_type(0), __a);
_M_copy(__r->_M_refdata(), __buf, __len);
__try
{
while (__beg != __end)
{
if (__len == __r->_M_capacity)
{
//\ Allocate\ more\ space\.
_Rep* __another = _Rep::_S_create(__len + 1, __len, __a);
_M_copy(__another->_M_refdata(), __r->_M_refdata(), __len);
__r->_M_destroy(__a);
__r = __another;
}
__r->_M_refdata()[__len++] = *__beg;
++__beg;
}
}
__catch(...)
{
__r->_M_destroy(__a);
__throw_exception_again;
}
__r->_M_set_length_and_sharable(__len);
return __r->_M_refdata();
}
template<typename _CharT, typename _Traits, typename _Alloc>
template <typename _InIterator>
_CharT*
basic_string&#60_CharT, _Traits, _Alloc&#62::
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
forward_iterator_tag)
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__beg == __end && __a == _Alloc())
return _S_empty_rep()._M_refdata();
#endif
//\ NB:\ Not\ required,\ but\ considered\ best\ practice\.
if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end)
__throw_logic_error(__N("basic_string::_S_construct null not valid"));
const size_type __dnew = static_cast<size_type>(std::distance(__beg,
__end));
//\ Check\ for\ out_of_range\ and\ length_error\ exceptions\.
_Rep* __r = _Rep::_S_create(__dnew, size_type(0), __a);
__try
{ _S_copy_chars(__r->_M_refdata(), __beg, __end); }
__catch(...)
{
__r->_M_destroy(__a);
__throw_exception_again;
}
__r->_M_set_length_and_sharable(__dnew);
return __r->_M_refdata();
}
template<typename _CharT, typename _Traits, typename _Alloc>
_CharT*
basic_string&#60_CharT, _Traits, _Alloc&#62::
_S_construct(size_type __n, _CharT __c, const _Alloc& __a)
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__n == 0 && __a == _Alloc())
return _S_empty_rep()._M_refdata();
#endif
//\ Check\ for\ out_of_range\ and\ length_error\ exceptions\.
_Rep* __r = _Rep::_S_create(__n, size_type(0), __a);
if (__n)
_M_assign(__r->_M_refdata(), __n, __c);
__r->_M_set_length_and_sharable(__n);
return __r->_M_refdata();
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const basic_string& __str)
: _M_dataplus(__str._M_rep()->_M_grab(_Alloc(__str.get_allocator()),
__str.get_allocator()),
__str.get_allocator())
{ }
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const _Alloc& __a)
: _M_dataplus(_S_construct(size_type(), _CharT(), __a), __a)
{ }
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const basic_string& __str, size_type __pos, const _Alloc& __a)
: _M_dataplus(_S_construct(__str._M_data()
+ __str._M_check(__pos,
"basic_string::basic_string"),
__str._M_data() + __str._M_limit(__pos, npos)
+ __pos, __a), __a)
{ }
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const basic_string& __str, size_type __pos, size_type __n)
: _M_dataplus(_S_construct(__str._M_data()
+ __str._M_check(__pos,
"basic_string::basic_string"),
__str._M_data() + __str._M_limit(__pos, __n)
+ __pos, _Alloc()), _Alloc())
{ }
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const basic_string& __str, size_type __pos,
size_type __n, const _Alloc& __a)
: _M_dataplus(_S_construct(__str._M_data()
+ __str._M_check(__pos,
"basic_string::basic_string"),
__str._M_data() + __str._M_limit(__pos, __n)
+ __pos, __a), __a)
{ }
//\ TBD:\ DPG\ annotate
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const _CharT* __s, size_type __n, const _Alloc& __a)
: _M_dataplus(_S_construct(__s, __s + __n, __a), __a)
{ }
//\ TBD:\ DPG\ annotate
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(const _CharT* __s, const _Alloc& __a)
: _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) :
__s + npos, __a), __a)
{ }
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(size_type __n, _CharT __c, const _Alloc& __a)
: _M_dataplus(_S_construct(__n, __c, __a), __a)
{ }
//\ TBD:\ DPG\ annotate
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InputIterator>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(_InputIterator __beg, _InputIterator __end, const _Alloc& __a)
: _M_dataplus(_S_construct(__beg, __end, __a), __a)
{ }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string&#60_CharT, _Traits, _Alloc&#62::
basic_string(initializer_list<_CharT> __l, const _Alloc& __a)
: _M_dataplus(_S_construct(__l.begin(), __l.end(), __a), __a)
{ }
#endif
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
assign(const basic_string& __str)
{
if (_M_rep() != __str._M_rep())
{
//\ XXX\ MT
const allocator_type __a = this->get_allocator();
_CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator());
_M_rep()->_M_dispose(__a);
_M_data(__tmp);
}
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
assign(const _CharT* __s, size_type __n)
{
__glibcxx_requires_string_len(__s, __n);
_M_check_length(this->size(), __n, "basic_string::assign");
if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
return _M_replace_safe(size_type(0), this->size(), __s, __n);
else
{
//\ Work\ in\-place\.
const size_type __pos = __s - _M_data();
if (__pos >= __n)
_M_copy(_M_data(), __s, __n);
else if (__pos)
_M_move(_M_data(), __s, __n);
_M_rep()->_M_set_length_and_sharable(__n);
return *this;
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
append(size_type __n, _CharT __c)
{
if (__n)
{
_M_check_length(size_type(0), __n, "basic_string::append");
const size_type __len = __n + this->size();
if (__len > this->capacity() || _M_rep()->_M_is_shared())
this->reserve(__len);
_M_assign(_M_data() + this->size(), __n, __c);
_M_rep()->_M_set_length_and_sharable(__len);
}
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
append(const _CharT* __s, size_type __n)
{
__glibcxx_requires_string_len(__s, __n);
if (__n)
{
_M_check_length(size_type(0), __n, "basic_string::append");
const size_type __len = __n + this->size();
if (__len > this->capacity() || _M_rep()->_M_is_shared())
{
if (_M_disjunct(__s))
this->reserve(__len);
else
{
const size_type __off = __s - _M_data();
this->reserve(__len);
__s = _M_data() + __off;
}
}
_M_copy(_M_data() + this->size(), __s, __n);
_M_rep()->_M_set_length_and_sharable(__len);
}
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
append(const basic_string& __str)
{
const size_type __size = __str.size();
if (__size)
{
const size_type __len = __size + this->size();
if (__len > this->capacity() || _M_rep()->_M_is_shared())
this->reserve(__len);
_M_copy(_M_data() + this->size(), __str._M_data(), __size);
_M_rep()->_M_set_length_and_sharable(__len);
}
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
append(const basic_string& __str, size_type __pos, size_type __n)
{
__str._M_check(__pos, "basic_string::append");
__n = __str._M_limit(__pos, __n);
if (__n)
{
const size_type __len = __n + this->size();
if (__len > this->capacity() || _M_rep()->_M_is_shared())
this->reserve(__len);
_M_copy(_M_data() + this->size(), __str._M_data() + __pos, __n);
_M_rep()->_M_set_length_and_sharable(__len);
}
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
insert(size_type __pos, const _CharT* __s, size_type __n)
{
__glibcxx_requires_string_len(__s, __n);
_M_check(__pos, "basic_string::insert");
_M_check_length(size_type(0), __n, "basic_string::insert");
if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
return _M_replace_safe(__pos, size_type(0), __s, __n);
else
{
//\ Work\ in\-place\.
const size_type __off = __s - _M_data();
_M_mutate(__pos, 0, __n);
__s = _M_data() + __off;
_CharT* __p = _M_data() + __pos;
if (__s + __n <= __p)
_M_copy(__p, __s, __n);
else if (__s >= __p)
_M_copy(__p, __s + __n, __n);
else
{
const size_type __nleft = __p - __s;
_M_copy(__p, __s, __nleft);
_M_copy(__p + __nleft, __p + __n, __n - __nleft);
}
return *this;
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::iterator
basic_string&#60_CharT, _Traits, _Alloc&#62::
erase(iterator __first, iterator __last)
{
_GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
&& __last <= _M_iend());
//\ NB:\ This\ isn't\ just\ an\ optimization\ \(bail\ out\ early\ when
//\ there\ is\ nothing\ to\ do,\ really\),\ it's\ also\ a\ correctness
//\ issue\ vs\ MT,\ see\ libstdc/40518\.
const size_type __size = __last - __first;
if (__size)
{
const size_type __pos = __first - _M_ibegin();
_M_mutate(__pos, __size, size_type(0));
_M_rep()->_M_set_leaked();
return iterator(_M_data() + __pos);
}
else
return __first;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
replace(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2)
{
__glibcxx_requires_string_len(__s, __n2);
_M_check(__pos, "basic_string::replace");
__n1 = _M_limit(__pos, __n1);
_M_check_length(__n1, __n2, "basic_string::replace");
bool __left;
if (_M_disjunct(__s) || _M_rep()->_M_is_shared())
return _M_replace_safe(__pos, __n1, __s, __n2);
else if ((__left = __s + __n2 <= _M_data() + __pos)
|| _M_data() + __pos + __n1 <= __s)
{
//\ Work\ in\-place:\ non\-overlapping\ case\.
size_type __off = __s - _M_data();
__left ? __off : (__off += __n2 - __n1);
_M_mutate(__pos, __n1, __n2);
_M_copy(_M_data() + __pos, _M_data() + __off, __n2);
return *this;
}
else
{
//\ Todo:\ overlapping\ case\.
const basic_string __tmp(__s, __n2);
return _M_replace_safe(__pos, __n1, __tmp._M_data(), __n2);
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::_Rep::
_M_destroy(const _Alloc& __a) throw ()
{
const size_type __size = sizeof(_Rep_base) +
(this->_M_capacity + 1) * sizeof(_CharT);
_Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_leak_hard()
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (_M_rep() == &_S_empty_rep())
return;
#endif
if (_M_rep()->_M_is_shared())
_M_mutate(0, 0, 0);
_M_rep()->_M_set_leaked();
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_mutate(size_type __pos, size_type __len1, size_type __len2)
{
const size_type __old_size = this->size();
const size_type __new_size = __old_size + __len2 - __len1;
const size_type __how_much = __old_size - __pos - __len1;
if (__new_size > this->capacity() || _M_rep()->_M_is_shared())
{
//\ Must\ reallocate\.
const allocator_type __a = get_allocator();
_Rep* __r = _Rep::_S_create(__new_size, this->capacity(), __a);
if (__pos)
_M_copy(__r->_M_refdata(), _M_data(), __pos);
if (__how_much)
_M_copy(__r->_M_refdata() + __pos + __len2,
_M_data() + __pos + __len1, __how_much);
_M_rep()->_M_dispose(__a);
_M_data(__r->_M_refdata());
}
else if (__how_much && __len1 != __len2)
{
//\ Work\ in\-place\.
_M_move(_M_data() + __pos + __len2,
_M_data() + __pos + __len1, __how_much);
}
_M_rep()->_M_set_length_and_sharable(__new_size);
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
reserve(size_type __res)
{
if (__res != this->capacity() || _M_rep()->_M_is_shared())
{
//\ Make\ sure\ we\ don't\ shrink\ below\ the\ current\ size
if (__res < this->size())
__res = this->size();
const allocator_type __a = get_allocator();
_CharT* __tmp = _M_rep()->_M_clone(__a, __res - this->size());
_M_rep()->_M_dispose(__a);
_M_data(__tmp);
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
swap(basic_string& __s)
_GLIBCXX_NOEXCEPT_IF(allocator_traits&#60_Alloc&#62::is_always_equal::value)
{
if (_M_rep()->_M_is_leaked())
_M_rep()->_M_set_sharable();
if (__s._M_rep()->_M_is_leaked())
__s._M_rep()->_M_set_sharable();
if (this->get_allocator() == __s.get_allocator())
{
_CharT* __tmp = _M_data();
_M_data(__s._M_data());
__s._M_data(__tmp);
}
//\ The\ code\ below\ can\ usually\ be\ optimized\ away\.
else
{
const basic_string __tmp1(_M_ibegin(), _M_iend(),
__s.get_allocator());
const basic_string __tmp2(__s._M_ibegin(), __s._M_iend(),
this->get_allocator());
*this = __tmp2;
__s = __tmp1;
}
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::_Rep*
basic_string&#60_CharT, _Traits, _Alloc&#62::_Rep::
_S_create(size_type __capacity, size_type __old_capacity,
const _Alloc& __alloc)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 83\.\ \ String::npos\ vs\.\ string::max_size\(\)
if (__capacity > _S_max_size)
__throw_length_error(__N("basic_string::_S_create"));
//\ The\ standard\ places\ no\ restriction\ on\ allocating\ more\ memory
//\ than\ is\ strictly\ needed\ within\ this\ layer\ at\ the\ moment\ or\ as
//\ requested\ by\ an\ explicit\ application\ call\ to\ reserve\(\)\.
//\ Many\ malloc\ implementations\ perform\ quite\ poorly\ when\ an
//\ application\ attempts\ to\ allocate\ memory\ in\ a\ stepwise\ fashion
//\ growing\ each\ allocation\ size\ by\ only\ 1\ char\.\ \ Additionally,
//\ it\ makes\ little\ sense\ to\ allocate\ less\ linear\ memory\ than\ the
//\ natural\ blocking\ size\ of\ the\ malloc\ implementation\.
//\ Unfortunately,\ we\ would\ need\ a\ somewhat\ low\-level\ calculation
//\ with\ tuned\ parameters\ to\ get\ this\ perfect\ for\ any\ particular
//\ malloc\ implementation\.\ \ Fortunately,\ generalizations\ about
//\ common\ features\ seen\ among\ implementations\ seems\ to\ suffice\.
//\ __pagesize\ need\ not\ match\ the\ actual\ VM\ page\ size\ for\ good
//\ results\ in\ practice,\ thus\ we\ pick\ a\ common\ value\ on\ the\ low
//\ side\.\ \ __malloc_header_size\ is\ an\ estimate\ of\ the\ amount\ of
//\ overhead\ per\ memory\ allocation\ \(in\ practice\ seen\ N\ \*\ sizeof
//\ \(void\*\)\ where\ N\ is\ 0,\ 2\ or\ 4\)\.\ \ According\ to\ folklore,
//\ picking\ this\ value\ on\ the\ high\ side\ is\ better\ than
//\ low\-balling\ it\ \(especially\ when\ this\ algorithm\ is\ used\ with
//\ malloc\ implementations\ that\ allocate\ memory\ blocks\ rounded\ up
//\ to\ a\ size\ which\ is\ a\ power\ of\ 2\)\.
const size_type __pagesize = 4096;
const size_type __malloc_header_size = 4 * sizeof(void*);
//\ The\ below\ implements\ an\ exponential\ growth\ policy,\ necessary\ to
//\ meet\ amortized\ linear\ time\ requirements\ of\ the\ library:\ see
// http://gcc\.gnu\.org/ml/libstdc/2001\-07/msg00085\.html\.
//\ It's\ active\ for\ allocations\ requiring\ an\ amount\ of\ memory\ above
//\ system\ pagesize\.\ This\ is\ consistent\ with\ the\ requirements\ of\ the
// standard: http://gcc\.gnu\.org/ml/libstdc/2001\-07/msg00130\.html
if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
__capacity = 2 * __old_capacity;
//\ NB:\ Need\ an\ array\ of\ char_type\[__capacity\],\ plus\ a\ terminating
//\ null\ char_type\(\)\ element,\ plus\ enough\ for\ the\ _Rep\ data\ structure\.
//\ Whew\.\ Seemingly\ so\ needy,\ yet\ so\ elemental\.
size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
const size_type __adj_size = __size + __malloc_header_size;
if (__adj_size > __pagesize && __capacity > __old_capacity)
{
const size_type __extra = __pagesize - __adj_size % __pagesize;
__capacity += __extra / sizeof(_CharT);
//\ Never\ allocate\ a\ string\ bigger\ than\ _S_max_size\.
if (__capacity > _S_max_size)
__capacity = _S_max_size;
__size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
}
//\ NB:\ Might\ throw,\ but\ no\ worries\ about\ a\ leak,\ mate:\ _Rep\(\)
//\ does\ not\ throw\.
void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
_Rep *__p = new (__place) _Rep;
__p->_M_capacity = __capacity;
//\ ABI\ compatibility\ \-\ 3\.4\.x\ set\ in\ _S_create\ both
//\ _M_refcount\ and\ _M_length\.\ \ All\ callers\ of\ _S_create
//\ in\ basic_string\.tcc\ then\ set\ just\ _M_length\.
//\ In\ 4\.0\.x\ and\ later\ both\ _M_refcount\ and\ _M_length
//\ are\ initialized\ in\ the\ callers,\ unfortunately\ we\ can
//\ have\ 3\.4\.x\ compiled\ code\ with\ _S_create\ callers\ inlined
//\ calling\ 4\.0\.x\ _S_create\.
__p->_M_set_sharable();
return __p;
}
template<typename _CharT, typename _Traits, typename _Alloc>
_CharT*
basic_string&#60_CharT, _Traits, _Alloc&#62::_Rep::
_M_clone(const _Alloc& __alloc, size_type __res)
{
//\ Requested\ capacity\ of\ the\ clone\.
const size_type __requested_cap = this->_M_length + __res;
_Rep* __r = _Rep::_S_create(__requested_cap, this->_M_capacity,
__alloc);
if (this->_M_length)
_M_copy(__r->_M_refdata(), _M_refdata(), this->_M_length);
__r->_M_set_length_and_sharable(this->_M_length);
return __r->_M_refdata();
}
template<typename _CharT, typename _Traits, typename _Alloc>
void
basic_string&#60_CharT, _Traits, _Alloc&#62::
resize(size_type __n, _CharT __c)
{
const size_type __size = this->size();
_M_check_length(__size, __n, "basic_string::resize");
if (__size < __n)
this->append(__n - __size, __c);
else if (__n < __size)
this->erase(__n);
//\ else\ nothing\ \(in\ particular,\ avoid\ calling\ _M_mutate\(\)\ unnecessarily\.\)
}
template<typename _CharT, typename _Traits, typename _Alloc>
template<typename _InputIterator>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
_InputIterator __k2, __false_type)
{
const basic_string __s(__k1, __k2);
const size_type __n1 = __i2 - __i1;
_M_check_length(__n1, __s.size(), "basic_string::_M_replace_dispatch");
return _M_replace_safe(__i1 - _M_ibegin(), __n1, __s._M_data(),
__s.size());
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
_CharT __c)
{
_M_check_length(__n1, __n2, "basic_string::_M_replace_aux");
_M_mutate(__pos1, __n1, __n2);
if (__n2)
_M_assign(_M_data() + __pos1, __n2, __c);
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>&
basic_string&#60_CharT, _Traits, _Alloc&#62::
_M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
size_type __n2)
{
_M_mutate(__pos1, __n1, __n2);
if (__n2)
_M_copy(_M_data() + __pos1, __s, __n2);
return *this;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string&#60_CharT, _Traits, _Alloc&#62::size_type
basic_string&#60_CharT, _Traits, _Alloc&#62::
copy(_CharT* __s, size_type __n, size_type __pos) const
{
_M_check(__pos, "basic_string::copy");
__n = _M_limit(__pos, __n);
__glibcxx_requires_string_len(__s, __n);
if (__n)
_M_copy(__s, _M_data() + __pos, __n);
//\ 21\.3\.5\.7\ par\ 3:\ do\ not\ append\ null\.\ \ \(good\.\)
return __n;
}
#endif // //\ !_GLIBCXX_USE_CXX11_ABI //\ !_GLIBCXX_USE_CXX11_ABI
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
40197855 push %rbp operator+(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{
__glibcxx_requires_string(__lhs);
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __string_type::size_type __size_type;
40198d48 8b 45 d0 mov -0x30(%rbp),%rax const __size_type __len = _Traits::length(__lhs);
40199d48 8b 45 d8 mov -0x28(%rbp),%rax __string_type __str;
4019a948 8b 45 c8 mov -0x38(%rbp),%rax __str.reserve(__len + __rhs.size());
4019b548 8b 55 e8 mov -0x18(%rbp),%rdx
4019cb48 8b 55 e8 mov -0x18(%rbp),%rdx __str.append(__lhs, __len);
4019e248 8b 55 c8 mov -0x38(%rbp),%rdx __str.append(__rhs);
4019f5eb 1a jmp401a11_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_+0x99 return __str;
401a1148 8b 45 d8 mov -0x28(%rbp),%rax }
_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEOS8_PKS5_
/usr/include/c++/9/bits/basic_string.h
//\ Components\ for\ manipulating\ sequences\ of\ characters\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 1997\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/basic_string.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{string}
*/
//
//\ ISO\ C\ 14882:\ 21\ Strings\ library
//
#ifndef _BASIC_STRING_H
#define _BASIC_STRING_H _BASIC_STRING_H 1 _BASIC_STRING_H 1
#pragma GCC GCC system_header GCC system_header
#include <ext/atomicity.h>
#include <ext/alloc_traits.h>
#include <debug/debug.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <initializer_list>
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
# include include <string_view> &#60string_view&#62
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if _GLIBCXX_USE_CXX11_ABI
_GLIBCXX_BEGIN_NAMESPACE_CXX11
/**
* @class basic_string basic_string.h <string>
* @brief Managing sequences of characters and character-like objects.
*
* @ingroup strings
* @ingroup sequences
*
* @tparam _CharT Type of character
* @tparam _Traits Traits for character type, defaults to
* char_traits<_CharT>.
* @tparam _Alloc Allocator type, defaults to allocator<_CharT>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>. Of the
* <a href="tables.html#68">optional sequence requirements</a>, only
* @c push_back, @c at, and @c %array access are supported.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Alloc&#62::template
rebind&#60_CharT&#62::other _Char_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;
//\ Types:
public:
typedef _Traits traits_type;
typedef typename _Traits::char_type value_type;
typedef _Char_alloc_type allocator_type;
typedef typename _Alloc_traits::size_type size_type;
typedef typename _Alloc_traits::difference_type difference_type;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef typename _Alloc_traits::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
///\ \ Value\ returned\ by\ various\ member\ functions\ when\ they\ fail\.
static const size_type npos = static_cast<size_type>(-1);
protected:
//\ type\ used\ for\ positions\ in\ insert,\ erase\ etc\.
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
typedef iterator __const_iterator;
#else
typedef const_iterator __const_iterator;
#endif
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
//\ A\ helper\ type\ for\ avoiding\ boiler\-plate\.
typedef basic_string_view<_CharT, _Traits> __sv_type;
template<typename _Tp, typename _Res>
using _If_sv = enable_if_t<
__and_<is_convertible<const _Tp&, __sv_type>,
__not_<is_convertible<const _Tp*, const basic_string*>>,
__not_&#60is_convertible&#60const _Tp&, const _CharT*&#62&#62&#62::value,
_Res>
//\ Allows\ an\ implicit\ conversion\ to\ __sv_type\.
static __sv_type
_S_to_string_view(__sv_type __svt) noexcept
{ return __svt; }
//\ Wraps\ a\ string_view\ by\ explicit\ conversion\ and\ thus
//\ allows\ to\ add\ an\ internal\ constructor\ that\ does\ not
//\ participate\ in\ overload\ resolution\ when\ a\ string_view
//\ is\ provided\.
struct __sv_wrapper
{
explicit __sv_wrapper(__sv_type __sv) noexcept : _M_sv(__sv) { }
__sv_type _M_sv;
};
/**
* @brief Only internally used: Construct string from a string view
* wrapper.
* @param __svw string view wrapper.
* @param __a Allocator to use.
*/
explicit
basic_string(__sv_wrapper __svw, const _Alloc& __a)
: basic_string(__svw._M_sv.data(), __svw._M_sv.size(), __a) { }
#endif
// Use empty-base optimization: http://www\.cantrip\.org/emptyopt\.html
struct _Alloc_hider : allocator_type //\ TODO\ check\ __is_final
{
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
_Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
: allocator_type(__a), _M_p(__dat) { }
#else
_Alloc_hider(pointer __dat, const _Alloc& __a)
: allocator_type(__a), _M_p(__dat) { }
_Alloc_hider(pointer __dat, _Alloc&& __a = _Alloc())
: allocator_type(std::move(__a)), _M_p(__dat) { }
#endif
pointer _M_p; //\ The\ actual\ data\.
};
_Alloc_hider _M_dataplus;
size_type _M_string_length;
enum { _S_local_capacity = 15 / sizeof(_CharT) };
union
{
_CharT _M_local_buf[_S_local_capacity + 1];
size_type _M_allocated_capacity;
};
void
_M_data(pointer __p)
{ _M_dataplus._M_p = __p; }
void
_M_length(size_type __length)
{ _M_string_length = __length; }
pointer
_M_data() const
{ return _M_dataplus._M_p; }
pointer
_M_local_data()
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
return <span class="namespc">std</span>::pointer_traits&#60pointer&#62::pointer_to(*_M_local_buf);
#else
return pointer(_M_local_buf);
#endif
}
const_pointer
_M_local_data() const
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
return <span class="namespc">std</span>::pointer_traits&#60const_pointer&#62::pointer_to(*_M_local_buf);
#else
return const_pointer(_M_local_buf);
#endif
}
void
_M_capacity(size_type __capacity)
{ _M_allocated_capacity = __capacity; }
void
_M_set_length(size_type __n)
{
_M_length(__n);
traits_type::assign(_M_data()[__n], _CharT());
}
bool
_M_is_local() const
{ return _M_data() == _M_local_data(); }
//\ Create\ &\ Destroy
pointer
_M_create(size_type&, size_type);
void
_M_dispose()
{
if (!_M_is_local())
_M_destroy(_M_allocated_capacity);
}
void
_M_destroy(size_type __size) throw()
{ _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); }
//\ _M_construct_aux\ is\ used\ to\ implement\ the\ 21\.3\.1\ para\ 15\ which
//\ requires\ special\ behaviour\ if\ _InIterator\ is\ an\ integral\ type
template<typename _InIterator>
void
_M_construct_aux(_InIterator __beg, _InIterator __end,
std::__false_type)
{
typedef typename iterator_traits&#60_InIterator&#62::iterator_category _Tag;
_M_construct(__beg, __end, _Tag());
}
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 438\.\ Ambiguity\ in\ the\ "do\ the\ right\ thing"\ clause
template<typename _Integer>
void
_M_construct_aux(_Integer __beg, _Integer __end, std::__true_type)
{ _M_construct_aux_2(static_cast<size_type>(__beg), __end); }
void
_M_construct_aux_2(size_type __req, _CharT __c)
{ _M_construct(__req, __c); }
template<typename _InIterator>
void
_M_construct(_InIterator __beg, _InIterator __end)
{
typedef typename <span class="namespc">std</span>::__is_integer&#60_InIterator&#62::__type _Integral;
_M_construct_aux(__beg, __end, _Integral());
}
//\ For\ Input\ Iterators,\ used\ in\ istreambuf_iterators,\ etc\.
template<typename _InIterator>
void
_M_construct(_InIterator __beg, _InIterator __end,
std::input_iterator_tag);
//\ For\ forward_iterators\ up\ to\ random_access_iterators,\ used\ for
//\ string::iterator,\ _CharT\*,\ etc\.
template<typename _FwdIterator>
void
_M_construct(_FwdIterator __beg, _FwdIterator __end,
std::forward_iterator_tag);
void
_M_construct(size_type __req, _CharT __c);
allocator_type&
_M_get_allocator()
{ return _M_dataplus; }
const allocator_type&
_M_get_allocator() const
{ return _M_dataplus; }
private:
#ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
//\ The\ explicit\ instantiations\ in\ misc\-inst\.cc\ require\ this\ due\ to
// https://gcc\.gnu\.org/bugzilla/show_bug\.cgi\?id=64063
template<typename _Tp, bool _Requires =
!__are_same&#60_Tp, _CharT*&#62::__value
&& !__are_same&#60_Tp, const _CharT*&#62::__value
&& !__are_same&#60_Tp, iterator&#62::__value
&& !__are_same&#60_Tp, const_iterator&#62::__value&#62
struct __enable_if_not_native_iterator
{ typedef basic_string& __type; };
template<typename _Tp>
struct __enable_if_not_native_iterator<_Tp, false> { };
#endif
size_type
_M_check(size_type __pos, const char* __s) const
{
if (__pos > this->size())
__throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
"this->size() (which is %zu)"),
__s, __pos, this->size());
return __pos;
}
void
_M_check_length(size_type __n1, size_type __n2, const char* __s) const
{
if (this->max_size() - (this->size() - __n1) < __n2)
__throw_length_error(__N(__s));
}
//\ NB:\ _M_limit\ doesn't\ check\ for\ a\ bad\ __pos\ value\.
size_type
_M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
{
const bool __testoff = __off < this->size() - __pos;
return __testoff ? __off : this->size() - __pos;
}
//\ True\ if\ _Rep\ and\ source\ do\ not\ overlap\.
bool
_M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
{
return (less<const _CharT*>()(__s, _M_data())
|| less<const _CharT*>()(_M_data() + this->size(), __s));
}
//\ When\ __n\ =\ 1\ way\ faster\ than\ the\ general\ multichar
//\ traits_type::copy/move/assign\.
static void
_S_copy(_CharT* __d, const _CharT* __s, size_type __n)
{
if (__n == 1)
traits_type::assign(*__d, *__s);
else
traits_type::copy(__d, __s, __n);
}
static void
_S_move(_CharT* __d, const _CharT* __s, size_type __n)
{
if (__n == 1)
traits_type::assign(*__d, *__s);
else
traits_type::move(__d, __s, __n);
}
static void
_S_assign(_CharT* __d, size_type __n, _CharT __c)
{
if (__n == 1)
traits_type::assign(*__d, __c);
else
traits_type::assign(__d, __n, __c);
}
//\ _S_copy_chars\ is\ a\ separate\ template\ to\ permit\ specialization
//\ to\ optimize\ for\ the\ common\ case\ of\ pointers\ as\ iterators\.
template<class _Iterator>
static void
_S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
{
for (; __k1 != __k2; ++__k1, (void)++__p)
traits_type::assign(*__p, *__k1); //\ These\ types\ are\ off\.
}
static void
_S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
{ _S_copy_chars(__p, __k1.base(), __k2.base()); }
static void
_S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
_GLIBCXX_NOEXCEPT
{ _S_copy_chars(__p, __k1.base(), __k2.base()); }
static void
_S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
{ _S_copy(__p, __k1, __k2 - __k1); }
static void
_S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
_GLIBCXX_NOEXCEPT
{ _S_copy(__p, __k1, __k2 - __k1); }
static int
_S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
{
const difference_type __d = difference_type(__n1 - __n2);
if (__d &#62 __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__max)
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__max;
else if (__d &#60 __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__min)
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__min;
else
return int(__d);
}
void
_M_assign(const basic_string&);
void
_M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
size_type __len2);
void
_M_erase(size_type __pos, size_type __n);
public:
//\ Construct/copy/destroy:
//\ NB:\ We\ overload\ ctors\ in\ some\ cases\ instead\ of\ using\ default
//\ arguments,\ per\ 17\.4\.4\.4\ para\.\ 2\ item\ 2\.
/**
* @brief Default constructor creates an empty string.
*/
basic_string()
_GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible&#60_Alloc&#62::value)
: _M_dataplus(_M_local_data())
{ _M_set_length(0); }
/**
* @brief Construct an empty string using allocator @a a.
*/
explicit
basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
: _M_dataplus(_M_local_data(), __a)
{ _M_set_length(0); }
/**
* @brief Construct string with copy of value of @a __str.
* @param __str Source string.
*/
basic_string(const basic_string& __str)
: _M_dataplus(_M_local_data(),
_Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
{ _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2583\.\ no\ way\ to\ supply\ an\ allocator\ for\ basic_string\(str,\ pos\)
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __a Allocator to use.
*/
basic_string(const basic_string& __str, size_type __pos,
const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{
const _CharT* __start = __str._M_data()
+ __str._M_check(__pos, "basic_string::basic_string");
_M_construct(__start, __start + __str._M_limit(__pos, npos));
}
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __n Number of characters to copy.
*/
basic_string(const basic_string& __str, size_type __pos,
size_type __n)
: _M_dataplus(_M_local_data())
{
const _CharT* __start = __str._M_data()
+ __str._M_check(__pos, "basic_string::basic_string");
_M_construct(__start, __start + __str._M_limit(__pos, __n));
}
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __n Number of characters to copy.
* @param __a Allocator to use.
*/
basic_string(const basic_string& __str, size_type __pos,
size_type __n, const _Alloc& __a)
: _M_dataplus(_M_local_data(), __a)
{
const _CharT* __start
= __str._M_data() + __str._M_check(__pos, "string::string");
_M_construct(__start, __start + __str._M_limit(__pos, __n));
}
/**
* @brief Construct string initialized by a character %array.
* @param __s Source character %array.
* @param __n Number of characters to copy.
* @param __a Allocator to use (default is default allocator).
*
* NB: @a __s must have at least @a __n characters, '\\0'
* has no special meaning.
*/
basic_string(const _CharT* __s, size_type __n,
const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__s, __s + __n); }
/**
* @brief Construct string as copy of a C string.
* @param __s Source C string.
* @param __a Allocator to use (default is default allocator).
*/
#if __cpp_deduction_guides __cpp_deduction_guides && __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3076\.\ basic_string\ CTAD\ ambiguity
template<typename = _RequireAllocator<_Alloc>>
#endif
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }
/**
* @brief Construct string as multiple characters.
* @param __n Number of characters.
* @param __c Character to use.
* @param __a Allocator to use (default is default allocator).
*/
#if __cpp_deduction_guides __cpp_deduction_guides && __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3076\.\ basic_string\ CTAD\ ambiguity
template<typename = _RequireAllocator<_Alloc>>
#endif
basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__n, __c); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Move construct string.
* @param __str Source string.
*
* The newly-created string contains the exact contents of @a __str.
* @a __str is a valid, but unspecified string.
**/
basic_string(basic_string&& __str) noexcept
: _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
{
if (__str._M_is_local())
{
traits_type::copy(_M_local_buf, __str._M_local_buf,
_S_local_capacity + 1);
}
else
{
_M_data(__str._M_data());
_M_capacity(__str._M_allocated_capacity);
}
//\ Must\ use\ _M_length\(\)\ here\ not\ _M_set_length\(\)\ because
//\ basic_stringbuf\ relies\ on\ writing\ into\ unallocated\ capacity\ so
//\ we\ mess\ up\ the\ contents\ if\ we\ put\ a\ '\0'\ in\ the\ string\.
_M_length(__str.length());
__str._M_data(__str._M_local_data());
__str._M_set_length(0);
}
/**
* @brief Construct string from an initializer %list.
* @param __l std::initializer_list of characters.
* @param __a Allocator to use (default is default allocator).
*/
basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__l.begin(), __l.end()); }
basic_string(const basic_string& __str, const _Alloc& __a)
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__str.begin(), __str.end()); }
basic_string(basic_string&& __str, const _Alloc& __a)
noexcept(_Alloc_traits::_S_always_equal())
: _M_dataplus(_M_local_data(), __a)
{
if (__str._M_is_local())
{
traits_type::copy(_M_local_buf, __str._M_local_buf,
_S_local_capacity + 1);
_M_length(__str.length());
__str._M_set_length(0);
}
else if (_Alloc_traits::_S_always_equal()
|| __str.get_allocator() == __a)
{
_M_data(__str._M_data());
_M_length(__str.length());
_M_capacity(__str._M_allocated_capacity);
__str._M_data(__str._M_local_buf);
__str._M_set_length(0);
}
else
_M_construct(__str.begin(), __str.end());
}
#endif // //\ C11 //\ C11
/**
* @brief Construct string as copy of a range.
* @param __beg Start of range.
* @param __end End of range.
* @param __a Allocator to use (default is default allocator).
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
#else
template<typename _InputIterator>
#endif
basic_string(_InputIterator __beg, _InputIterator __end,
const _Alloc& __a = _Alloc())
: _M_dataplus(_M_local_data(), __a)
{ _M_construct(__beg, __end); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Construct string from a substring of a string_view.
* @param __t Source object convertible to string view.
* @param __pos The index of the first character to copy from __t.
* @param __n The number of characters to copy from __t.
* @param __a Allocator to use.
*/
template<typename _Tp, typename = _If_sv<_Tp, void>>
basic_string(const _Tp& __t, size_type __pos, size_type __n,
const _Alloc& __a = _Alloc())
: basic_string(_S_to_string_view(__t).substr(__pos, __n), __a) { }
/**
* @brief Construct string from a string_view.
* @param __t Source object convertible to string view.
* @param __a Allocator to use (default is default allocator).
*/
template<typename _Tp, typename = _If_sv<_Tp, void>>
explicit
basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
: basic_string(__sv_wrapper(_S_to_string_view(__t)), __a) { }
#endif // //\ C17 //\ C17
/**
* @brief Destroy the string instance.
*/
~basic_string()
{ _M_dispose(); }
/**
* @brief Assign the value of @a str to this string.
* @param __str Source string.
*/
basic_string&
operator=(const basic_string& __str)
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
if (_Alloc_traits::_S_propagate_on_copy_assign())
{
if (!_Alloc_traits::_S_always_equal() && !_M_is_local()
&& _M_get_allocator() != __str._M_get_allocator())
{
//\ Propagating\ allocator\ cannot\ free\ existing\ storage\ so\ must
//\ deallocate\ it\ before\ replacing\ current\ allocator\.
if (__str.size() <= _S_local_capacity)
{
_M_destroy(_M_allocated_capacity);
_M_data(_M_local_data());
_M_set_length(0);
}
else
{
const auto __len = __str.size();
auto __alloc = __str._M_get_allocator();
//\ If\ this\ allocation\ throws\ there\ are\ no\ effects:
auto __ptr = _Alloc_traits::allocate(__alloc, __len + 1);
_M_destroy(_M_allocated_capacity);
_M_data(__ptr);
_M_capacity(__len);
_M_set_length(__len);
}
}
std::__alloc_on_copy(_M_get_allocator(), __str._M_get_allocator());
}
#endif
return this->assign(__str);
}
/**
* @brief Copy contents of @a s into this string.
* @param __s Source null-terminated string.
*/
basic_string&
operator=(const _CharT* __s)
{ return this->assign(__s); }
/**
* @brief Set value to string of length 1.
* @param __c Source character.
*
* Assigning to a character makes this string length 1 and
* (*this)[0] == @a c.
*/
basic_string&
operator=(_CharT __c)
{
this->assign(1, __c);
return *this;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Move assign the value of @a str to this string.
* @param __str Source string.
*
* The contents of @a str are moved into this string (without copying).
* @a str is a valid, but unspecified string.
**/
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2063\.\ Contradictory\ requirements\ for\ string\ move\ assignment
basic_string&
operator=(basic_string&& __str)
noexcept(_Alloc_traits::_S_nothrow_move())
{
if (!_M_is_local() && _Alloc_traits::_S_propagate_on_move_assign()
&& !_Alloc_traits::_S_always_equal()
&& _M_get_allocator() != __str._M_get_allocator())
{
//\ Destroy\ existing\ storage\ before\ replacing\ allocator\.
_M_destroy(_M_allocated_capacity);
_M_data(_M_local_data());
_M_set_length(0);
}
//\ Replace\ allocator\ if\ POCMA\ is\ true\.
std::__alloc_on_move(_M_get_allocator(), __str._M_get_allocator());
if (__str._M_is_local())
{
//\ We've\ always\ got\ room\ for\ a\ short\ string,\ just\ copy\ it\.
if (__str.size())
this->_S_copy(_M_data(), __str._M_data(), __str.size());
_M_set_length(__str.size());
}
else if (_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal()
|| _M_get_allocator() == __str._M_get_allocator())
{
//\ Just\ move\ the\ allocated\ pointer,\ our\ allocator\ can\ free\ it\.
pointer __data = nullptr;
size_type __capacity;
if (!_M_is_local())
{
if (_Alloc_traits::_S_always_equal())
{
//\ __str\ can\ reuse\ our\ existing\ storage\.
__data = _M_data();
__capacity = _M_allocated_capacity;
}
else //\ __str\ can't\ use\ it,\ so\ free\ it\.
_M_destroy(_M_allocated_capacity);
}
_M_data(__str._M_data());
_M_length(__str.length());
_M_capacity(__str._M_allocated_capacity);
if (__data)
{
__str._M_data(__data);
__str._M_capacity(__capacity);
}
else
__str._M_data(__str._M_local_buf);
}
else //\ Need\ to\ do\ a\ deep\ copy
assign(__str);
__str.clear();
return *this;
}
/**
* @brief Set value to string constructed from initializer %list.
* @param __l std::initializer_list.
*/
basic_string&
operator=(initializer_list<_CharT> __l)
{
this->assign(__l.begin(), __l.size());
return *this;
}
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Set value to string constructed from a string_view.
* @param __svt An object convertible to string_view.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
operator=(const _Tp& __svt)
{ return this->assign(__svt); }
/**
* @brief Convert to a string_view.
* @return A string_view.
*/
operator __sv_type() const noexcept
{ return __sv_type(data(), size()); }
#endif // //\ C17 //\ C17
//\ Iterators:
/**
* Returns a read/write iterator that points to the first character in
* the %string.
*/
iterator
begin() _GLIBCXX_NOEXCEPT
{ return iterator(_M_data()); }
/**
* Returns a read-only (constant) iterator that points to the first
* character in the %string.
*/
const_iterator
begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_M_data()); }
/**
* Returns a read/write iterator that points one past the last
* character in the %string.
*/
iterator
end() _GLIBCXX_NOEXCEPT
{ return iterator(_M_data() + this->size()); }
/**
* Returns a read-only (constant) iterator that points one past the
* last character in the %string.
*/
const_iterator
end() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_M_data() + this->size()); }
/**
* Returns a read/write reverse iterator that points to the last
* character in the %string. Iteration is done in reverse element
* order.
*/
reverse_iterator
rbegin() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(this->end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last character in the %string. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
rbegin() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(this->end()); }
/**
* Returns a read/write reverse iterator that points to one before the
* first character in the %string. Iteration is done in reverse
* element order.
*/
reverse_iterator
rend() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(this->begin()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first character in the %string. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
rend() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(this->begin()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read-only (constant) iterator that points to the first
* character in the %string.
*/
const_iterator
cbegin() const noexcept
{ return const_iterator(this->_M_data()); }
/**
* Returns a read-only (constant) iterator that points one past the
* last character in the %string.
*/
const_iterator
cend() const noexcept
{ return const_iterator(this->_M_data() + this->size()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last character in the %string. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
crbegin() const noexcept
{ return const_reverse_iterator(this->end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first character in the %string. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
crend() const noexcept
{ return const_reverse_iterator(this->begin()); }
#endif
public:
//\ Capacity:
///\ \ Returns\ the\ number\ of\ characters\ in\ the\ string,\ not\ including\ any
///\ \ null\-termination\.
size_type
size() const _GLIBCXX_NOEXCEPT
{ return _M_string_length; }
///\ \ Returns\ the\ number\ of\ characters\ in\ the\ string,\ not\ including\ any
///\ \ null\-termination\.
size_type
length() const _GLIBCXX_NOEXCEPT
{ return _M_string_length; }
///\ \ Returns\ the\ size\(\)\ of\ the\ largest\ possible\ %string\.
size_type
max_size() const _GLIBCXX_NOEXCEPT
{ return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; }
/**
* @brief Resizes the %string to the specified number of characters.
* @param __n Number of characters the %string should contain.
* @param __c Character to fill any new elements.
*
* This function will %resize the %string to the specified
* number of characters. If the number is smaller than the
* %string's current size the %string is truncated, otherwise
* the %string is extended and new elements are %set to @a __c.
*/
void
resize(size_type __n, _CharT __c);
/**
* @brief Resizes the %string to the specified number of characters.
* @param __n Number of characters the %string should contain.
*
* This function will resize the %string to the specified length. If
* the new size is smaller than the %string's current size the %string
* is truncated, otherwise the %string is extended and new characters
* are default-constructed. For basic types such as char, this means
* setting them to 0.
*/
void
resize(size_type __n)
{ this->resize(__n, _CharT()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
///\ \ A\ non\-binding\ request\ to\ reduce\ capacity\(\)\ to\ size\(\)\.
void
shrink_to_fit() noexcept
{
#if __cpp_exceptions
if (capacity() > size())
{
try
{ reserve(0); }
catch(...)
{ }
}
#endif
}
#endif
/**
* Returns the total number of characters that the %string can hold
* before needing to allocate more memory.
*/
size_type
capacity() const _GLIBCXX_NOEXCEPT
{
return _M_is_local() ? size_type(_S_local_capacity)
: _M_allocated_capacity;
}
/**
* @brief Attempt to preallocate enough memory for specified number of
* characters.
* @param __res_arg Number of characters required.
* @throw std::length_error If @a __res_arg exceeds @c max_size().
*
* This function attempts to reserve enough memory for the
* %string to hold the specified number of characters. If the
* number requested is more than max_size(), length_error is
* thrown.
*
* The advantage of this function is that if optimal code is a
* necessity and the user can determine the string length that will be
* required, the user can reserve the memory in %advance, and thus
* prevent a possible reallocation of memory and copying of %string
* data.
*/
void
reserve(size_type __res_arg = 0);
/**
* Erases the string, making it empty.
*/
void
clear() _GLIBCXX_NOEXCEPT
{ _M_set_length(0); }
/**
* Returns true if the %string is empty. Equivalent to
* <code>*this == ""</code>.
*/
_GLIBCXX_NODISCARD bool
empty() const _GLIBCXX_NOEXCEPT
{ return this->size() == 0; }
//\ Element\ access:
/**
* @brief Subscript access to the data contained in the %string.
* @param __pos The index of the character to access.
* @return Read-only (constant) reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
const_reference
operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
{
__glibcxx_assert(__pos <= size());
return _M_data()[__pos];
}
/**
* @brief Subscript access to the data contained in the %string.
* @param __pos The index of the character to access.
* @return Read/write reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
reference
operator[](size_type __pos)
{
//\ Allow\ pos\ ==\ size\(\)\ both\ in\ C98\ mode,\ as\ v3\ extension,
//\ and\ in\ C11\ mode\.
__glibcxx_assert(__pos <= size());
//\ In\ pedantic\ mode\ be\ strict\ in\ C98\ mode\.
_GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
return _M_data()[__pos];
}
/**
* @brief Provides access to the data contained in the %string.
* @param __n The index of the character to access.
* @return Read-only (const) reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails.
*/
const_reference
at(size_type __n) const
{
if (__n >= this->size())
__throw_out_of_range_fmt(__N("basic_string::at: __n "
"(which is %zu) >= this->size() "
"(which is %zu)"),
__n, this->size());
return _M_data()[__n];
}
/**
* @brief Provides access to the data contained in the %string.
* @param __n The index of the character to access.
* @return Read/write reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails.
*/
reference
at(size_type __n)
{
if (__n >= size())
__throw_out_of_range_fmt(__N("basic_string::at: __n "
"(which is %zu) >= this->size() "
"(which is %zu)"),
__n, this->size());
return _M_data()[__n];
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read/write reference to the data at the first
* element of the %string.
*/
reference
front() noexcept
{
__glibcxx_assert(!empty());
return operator[](0);
}
/**
* Returns a read-only (constant) reference to the data at the first
* element of the %string.
*/
const_reference
front() const noexcept
{
__glibcxx_assert(!empty());
return operator[](0);
}
/**
* Returns a read/write reference to the data at the last
* element of the %string.
*/
reference
back() noexcept
{
__glibcxx_assert(!empty());
return operator[](this->size() - 1);
}
/**
* Returns a read-only (constant) reference to the data at the
* last element of the %string.
*/
const_reference
back() const noexcept
{
__glibcxx_assert(!empty());
return operator[](this->size() - 1);
}
#endif
//\ Modifiers:
/**
* @brief Append a string to this string.
* @param __str The string to append.
* @return Reference to this string.
*/
basic_string&
operator+=(const basic_string& __str)
{ return this->append(__str); }
/**
* @brief Append a C string.
* @param __s The C string to append.
* @return Reference to this string.
*/
basic_string&
operator+=(const _CharT* __s)
{ return this->append(__s); }
/**
* @brief Append a character.
* @param __c The character to append.
* @return Reference to this string.
*/
basic_string&
operator+=(_CharT __c)
{
this->push_back(__c);
return *this;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Append an initializer_list of characters.
* @param __l The initializer_list of characters to be appended.
* @return Reference to this string.
*/
basic_string&
operator+=(initializer_list<_CharT> __l)
{ return this->append(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Append a string_view.
* @param __svt An object convertible to string_view to be appended.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
operator+=(const _Tp& __svt)
{ return this->append(__svt); }
#endif // //\ C17 //\ C17
/**
* @brief Append a string to this string.
* @param __str The string to append.
* @return Reference to this string.
*/
basic_string&
append(const basic_string& __str)
{ return _M_append(__str._M_data(), __str.size()); }
/**
* @brief Append a substring.
* @param __str The string to append.
* @param __pos Index of the first character of str to append.
* @param __n The number of characters to append.
* @return Reference to this string.
* @throw std::out_of_range if @a __pos is not a valid index.
*
* This function appends @a __n characters from @a __str
* starting at @a __pos to this string. If @a __n is is larger
* than the number of available characters in @a __str, the
* remainder of @a __str is appended.
*/
basic_string&
append(const basic_string& __str, size_type __pos, size_type __n = npos)
{ return _M_append(__str._M_data()
+ __str._M_check(__pos, "basic_string::append"),
__str._M_limit(__pos, __n)); }
/**
* @brief Append a C substring.
* @param __s The C string to append.
* @param __n The number of characters to append.
* @return Reference to this string.
*/
basic_string&
append(const _CharT* __s, size_type __n)
{
__glibcxx_requires_string_len(__s, __n);
_M_check_length(size_type(0), __n, "basic_string::append");
return _M_append(__s, __n);
}
/**
* @brief Append a C string.
* @param __s The C string to append.
* @return Reference to this string.
*/
basic_string&
append(const _CharT* __s)
{
__glibcxx_requires_string(__s);
const size_type __n = traits_type::length(__s);
_M_check_length(size_type(0), __n, "basic_string::append");
return _M_append(__s, __n);
}
/**
* @brief Append multiple characters.
* @param __n The number of characters to append.
* @param __c The character to use.
* @return Reference to this string.
*
* Appends __n copies of __c to this string.
*/
basic_string&
append(size_type __n, _CharT __c)
{ return _M_replace_aux(this->size(), size_type(0), __n, __c); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Append an initializer_list of characters.
* @param __l The initializer_list of characters to append.
* @return Reference to this string.
*/
basic_string&
append(initializer_list<_CharT> __l)
{ return this->append(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
/**
* @brief Append a range of characters.
* @param __first Iterator referencing the first character to append.
* @param __last Iterator marking the end of the range.
* @return Reference to this string.
*
* Appends characters in the range [__first,__last) to this string.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
#else
template<class _InputIterator>
#endif
basic_string&
append(_InputIterator __first, _InputIterator __last)
{ return this->replace(end(), end(), __first, __last); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Append a string_view.
* @param __svt An object convertible to string_view to be appended.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
append(const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->append(__sv.data(), __sv.size());
}
/**
* @brief Append a range of characters from a string_view.
* @param __svt An object convertible to string_view to be appended from.
* @param __pos The position in the string_view to append from.
* @param __n The number of characters to append from the string_view.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
append(const _Tp& __svt, size_type __pos, size_type __n = npos)
{
__sv_type __sv = __svt;
return _M_append(__sv.data()
+ std::__sv_check(__sv.size(), __pos, "basic_string::append"),
std::__sv_limit(__sv.size(), __pos, __n));
}
#endif // //\ C17 //\ C17
/**
* @brief Append a single character.
* @param __c Character to append.
*/
void
push_back(_CharT __c)
{
const size_type __size = this->size();
if (__size + 1 > this->capacity())
this->_M_mutate(__size, size_type(0), 0, size_type(1));
traits_type::assign(this->_M_data()[__size], __c);
this->_M_set_length(__size + 1);
}
/**
* @brief Set value to contents of another string.
* @param __str Source string to use.
* @return Reference to this string.
*/
basic_string&
assign(const basic_string& __str)
{
this->_M_assign(__str);
return *this;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Set value to contents of another string.
* @param __str Source string to use.
* @return Reference to this string.
*
* This function sets this string to the exact contents of @a __str.
* @a __str is a valid, but unspecified string.
*/
basic_string&
assign(basic_string&& __str)
noexcept(_Alloc_traits::_S_nothrow_move())
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2063\.\ Contradictory\ requirements\ for\ string\ move\ assignment
return *this = std::move(__str);
}
#endif // //\ C11 //\ C11
/**
* @brief Set value to a substring of a string.
* @param __str The string to use.
* @param __pos Index of the first character of str.
* @param __n Number of characters to use.
* @return Reference to this string.
* @throw std::out_of_range if @a pos is not a valid index.
*
* This function sets this string to the substring of @a __str
* consisting of @a __n characters at @a __pos. If @a __n is
* is larger than the number of available characters in @a
* __str, the remainder of @a __str is used.
*/
basic_string&
assign(const basic_string& __str, size_type __pos, size_type __n = npos)
{ return _M_replace(size_type(0), this->size(), __str._M_data()
+ __str._M_check(__pos, "basic_string::assign"),
__str._M_limit(__pos, __n)); }
/**
* @brief Set value to a C substring.
* @param __s The C string to use.
* @param __n Number of characters to use.
* @return Reference to this string.
*
* This function sets the value of this string to the first @a __n
* characters of @a __s. If @a __n is is larger than the number of
* available characters in @a __s, the remainder of @a __s is used.
*/
basic_string&
assign(const _CharT* __s, size_type __n)
{
__glibcxx_requires_string_len(__s, __n);
return _M_replace(size_type(0), this->size(), __s, __n);
}
/**
* @brief Set value to contents of a C string.
* @param __s The C string to use.
* @return Reference to this string.
*
* This function sets the value of this string to the value of @a __s.
* The data is copied, so there is no dependence on @a __s once the
* function returns.
*/
basic_string&
assign(const _CharT* __s)
{
__glibcxx_requires_string(__s);
return _M_replace(size_type(0), this->size(), __s,
traits_type::length(__s));
}
/**
* @brief Set value to multiple characters.
* @param __n Length of the resulting string.
* @param __c The character to use.
* @return Reference to this string.
*
* This function sets the value of this string to @a __n copies of
* character @a __c.
*/
basic_string&
assign(size_type __n, _CharT __c)
{ return _M_replace_aux(size_type(0), this->size(), __n, __c); }
/**
* @brief Set value to a range of characters.
* @param __first Iterator referencing the first character to append.
* @param __last Iterator marking the end of the range.
* @return Reference to this string.
*
* Sets value of string to characters in the range [__first,__last).
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
#else
template<class _InputIterator>
#endif
basic_string&
assign(_InputIterator __first, _InputIterator __last)
{ return this->replace(begin(), end(), __first, __last); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Set value to an initializer_list of characters.
* @param __l The initializer_list of characters to assign.
* @return Reference to this string.
*/
basic_string&
assign(initializer_list<_CharT> __l)
{ return this->assign(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Set value from a string_view.
* @param __svt The source object convertible to string_view.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
assign(const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->assign(__sv.data(), __sv.size());
}
/**
* @brief Set value from a range of characters in a string_view.
* @param __svt The source object convertible to string_view.
* @param __pos The position in the string_view to assign from.
* @param __n The number of characters to assign.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
assign(const _Tp& __svt, size_type __pos, size_type __n = npos)
{
__sv_type __sv = __svt;
return _M_replace(size_type(0), this->size(),
__sv.data()
+ std::__sv_check(__sv.size(), __pos, "basic_string::assign"),
std::__sv_limit(__sv.size(), __pos, __n));
}
#endif // //\ C17 //\ C17
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Insert multiple characters.
* @param __p Const_iterator referencing location in string to
* insert at.
* @param __n Number of characters to insert
* @param __c The character to insert.
* @return Iterator referencing the first inserted char.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts @a __n copies of character @a __c starting at the
* position referenced by iterator @a __p. If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
iterator
insert(const_iterator __p, size_type __n, _CharT __c)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
const size_type __pos = __p - begin();
this->replace(__p, __p, __n, __c);
return iterator(this->_M_data() + __pos);
}
#else
/**
* @brief Insert multiple characters.
* @param __p Iterator referencing location in string to insert at.
* @param __n Number of characters to insert
* @param __c The character to insert.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts @a __n copies of character @a __c starting at the
* position referenced by iterator @a __p. If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
void
insert(iterator __p, size_type __n, _CharT __c)
{ this->replace(__p, __p, __n, __c); }
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Insert a range of characters.
* @param __p Const_iterator referencing location in string to
* insert at.
* @param __beg Start of range.
* @param __end End of range.
* @return Iterator referencing the first inserted char.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts characters in range [beg,end). If adding characters
* causes the length to exceed max_size(), length_error is
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
const size_type __pos = __p - begin();
this->replace(__p, __p, __beg, __end);
return iterator(this->_M_data() + __pos);
}
#else
/**
* @brief Insert a range of characters.
* @param __p Iterator referencing location in string to insert at.
* @param __beg Start of range.
* @param __end End of range.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts characters in range [__beg,__end). If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
template<class _InputIterator>
void
insert(iterator __p, _InputIterator __beg, _InputIterator __end)
{ this->replace(__p, __p, __beg, __end); }
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Insert an initializer_list of characters.
* @param __p Iterator referencing location in string to insert at.
* @param __l The initializer_list of characters to insert.
* @throw std::length_error If new length exceeds @c max_size().
*/
iterator
insert(const_iterator __p, initializer_list<_CharT> __l)
{ return this->insert(__p, __l.begin(), __l.end()); }
#ifdef _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
//\ See\ PR\ libstdc/83328
void
insert(iterator __p, initializer_list<_CharT> __l)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
this->insert(__p - begin(), __l.begin(), __l.size());
}
#endif
#endif // //\ C11 //\ C11
/**
* @brief Insert value of a string.
* @param __pos1 Iterator referencing location in string to insert at.
* @param __str The string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts value of @a __str starting at @a __pos1. If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
insert(size_type __pos1, const basic_string& __str)
{ return this->replace(__pos1, size_type(0),
__str._M_data(), __str.size()); }
/**
* @brief Insert a substring.
* @param __pos1 Iterator referencing location in string to insert at.
* @param __str The string to insert.
* @param __pos2 Start of characters in str to insert.
* @param __n Number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos1 > size() or
* @a __pos2 > @a str.size().
*
* Starting at @a pos1, insert @a __n character of @a __str
* beginning with @a __pos2. If adding characters causes the
* length to exceed max_size(), length_error is thrown. If @a
* __pos1 is beyond the end of this string or @a __pos2 is
* beyond the end of @a __str, out_of_range is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
insert(size_type __pos1, const basic_string& __str,
size_type __pos2, size_type __n = npos)
{ return this->replace(__pos1, size_type(0), __str._M_data()
+ __str._M_check(__pos2, "basic_string::insert"),
__str._M_limit(__pos2, __n)); }
/**
* @brief Insert a C substring.
* @param __pos Iterator referencing location in string to insert at.
* @param __s The C string to insert.
* @param __n The number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a __pos is beyond the end of this
* string.
*
* Inserts the first @a __n characters of @a __s starting at @a
* __pos. If adding characters causes the length to exceed
* max_size(), length_error is thrown. If @a __pos is beyond
* end(), out_of_range is thrown. The value of the string
* doesn't change if an error is thrown.
*/
basic_string&
insert(size_type __pos, const _CharT* __s, size_type __n)
{ return this->replace(__pos, size_type(0), __s, __n); }
/**
* @brief Insert a C string.
* @param __pos Iterator referencing location in string to insert at.
* @param __s The C string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Inserts the first @a n characters of @a __s starting at @a __pos. If
* adding characters causes the length to exceed max_size(),
* length_error is thrown. If @a __pos is beyond end(), out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string&
insert(size_type __pos, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->replace(__pos, size_type(0), __s,
traits_type::length(__s));
}
/**
* @brief Insert multiple characters.
* @param __pos Index in string to insert at.
* @param __n Number of characters to insert
* @param __c The character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a __pos is beyond the end of this
* string.
*
* Inserts @a __n copies of character @a __c starting at index
* @a __pos. If adding characters causes the length to exceed
* max_size(), length_error is thrown. If @a __pos > length(),
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
insert(size_type __pos, size_type __n, _CharT __c)
{ return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
size_type(0), __n, __c); }
/**
* @brief Insert one character.
* @param __p Iterator referencing position in string to insert at.
* @param __c The character to insert.
* @return Iterator referencing newly inserted char.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts character @a __c at position referenced by @a __p.
* If adding character causes the length to exceed max_size(),
* length_error is thrown. If @a __p is beyond end of string,
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
iterator
insert(__const_iterator __p, _CharT __c)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
const size_type __pos = __p - begin();
_M_replace_aux(__pos, size_type(0), size_type(1), __c);
return iterator(_M_data() + __pos);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Insert a string_view.
* @param __pos Iterator referencing position in string to insert at.
* @param __svt The object convertible to string_view to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
insert(size_type __pos, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->insert(__pos, __sv.data(), __sv.size());
}
/**
* @brief Insert a string_view.
* @param __pos Iterator referencing position in string to insert at.
* @param __svt The object convertible to string_view to insert from.
* @param __pos Iterator referencing position in string_view to insert
* from.
* @param __n The number of characters to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
insert(size_type __pos1, const _Tp& __svt,
size_type __pos2, size_type __n = npos)
{
__sv_type __sv = __svt;
return this->replace(__pos1, size_type(0),
__sv.data()
+ std::__sv_check(__sv.size(), __pos2, "basic_string::insert"),
std::__sv_limit(__sv.size(), __pos2, __n));
}
#endif // //\ C17 //\ C17
/**
* @brief Remove characters.
* @param __pos Index of first character to remove (default 0).
* @param __n Number of characters to remove (default remainder).
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Removes @a __n characters from this string starting at @a
* __pos. The length of the string is reduced by @a __n. If
* there are < @a __n characters to remove, the remainder of
* the string is truncated. If @a __p is beyond end of string,
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
erase(size_type __pos = 0, size_type __n = npos)
{
_M_check(__pos, "basic_string::erase");
if (__n == npos)
this->_M_set_length(__pos);
else if (__n != 0)
this->_M_erase(__pos, _M_limit(__pos, __n));
return *this;
}
/**
* @brief Remove one character.
* @param __position Iterator referencing the character to remove.
* @return iterator referencing same location after removal.
*
* Removes the character at @a __position from this string. The value
* of the string doesn't change if an error is thrown.
*/
iterator
erase(__const_iterator __position)
{
_GLIBCXX_DEBUG_PEDASSERT(__position >= begin()
&& __position < end());
const size_type __pos = __position - begin();
this->_M_erase(__pos, size_type(1));
return iterator(_M_data() + __pos);
}
/**
* @brief Remove a range of characters.
* @param __first Iterator referencing the first character to remove.
* @param __last Iterator referencing the end of the range.
* @return Iterator referencing location of first after removal.
*
* Removes the characters in the range [first,last) from this string.
* The value of the string doesn't change if an error is thrown.
*/
iterator
erase(__const_iterator __first, __const_iterator __last)
{
_GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last
&& __last <= end());
const size_type __pos = __first - begin();
if (__last == end())
this->_M_set_length(__pos);
else
this->_M_erase(__pos, __last - __first);
return iterator(this->_M_data() + __pos);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Remove the last character.
*
* The string must be non-empty.
*/
void
pop_back() noexcept
{
__glibcxx_assert(!empty());
_M_erase(size() - 1, 1);
}
#endif // //\ C11 //\ C11
/**
* @brief Replace characters with value from another string.
* @param __pos Index of first character to replace.
* @param __n Number of characters to be replaced.
* @param __str String to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos+__n) from
* this string. In place, the value of @a __str is inserted.
* If @a __pos is beyond end of string, out_of_range is thrown.
* If the length of the result exceeds max_size(), length_error
* is thrown. The value of the string doesn't change if an
* error is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n, const basic_string& __str)
{ return this->replace(__pos, __n, __str._M_data(), __str.size()); }
/**
* @brief Replace characters with value from another string.
* @param __pos1 Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __str String to insert.
* @param __pos2 Index of first character of str to use.
* @param __n2 Number of characters from str to use.
* @return Reference to this string.
* @throw std::out_of_range If @a __pos1 > size() or @a __pos2 >
* __str.size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos1,__pos1 + n) from this
* string. In place, the value of @a __str is inserted. If @a __pos is
* beyond end of string, out_of_range is thrown. If the length of the
* result exceeds max_size(), length_error is thrown. The value of the
* string doesn't change if an error is thrown.
*/
basic_string&
replace(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2 = npos)
{ return this->replace(__pos1, __n1, __str._M_data()
+ __str._M_check(__pos2, "basic_string::replace"),
__str._M_limit(__pos2, __n2)); }
/**
* @brief Replace characters with value of a C substring.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __s C string to insert.
* @param __n2 Number of characters from @a s to use.
* @return Reference to this string.
* @throw std::out_of_range If @a pos1 > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos + __n1)
* from this string. In place, the first @a __n2 characters of
* @a __s are inserted, or all of @a __s if @a __n2 is too large. If
* @a __pos is beyond end of string, out_of_range is thrown. If
* the length of result exceeds max_size(), length_error is
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2)
{
__glibcxx_requires_string_len(__s, __n2);
return _M_replace(_M_check(__pos, "basic_string::replace"),
_M_limit(__pos, __n1), __s, __n2);
}
/**
* @brief Replace characters with value of a C string.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __s C string to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos + __n1)
* from this string. In place, the characters of @a __s are
* inserted. If @a __pos is beyond end of string, out_of_range
* is thrown. If the length of result exceeds max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->replace(__pos, __n1, __s, traits_type::length(__s));
}
/**
* @brief Replace characters with multiple characters.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __n2 Number of characters to insert.
* @param __c Character to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a __pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos + n1) from this
* string. In place, @a __n2 copies of @a __c are inserted.
* If @a __pos is beyond end of string, out_of_range is thrown.
* If the length of result exceeds max_size(), length_error is
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
{ return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
_M_limit(__pos, __n1), __n2, __c); }
/**
* @brief Replace range of characters with string.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __str String value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the value of @a __str is inserted. If the length of result
* exceeds max_size(), length_error is thrown. The value of
* the string doesn't change if an error is thrown.
*/
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
const basic_string& __str)
{ return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
/**
* @brief Replace range of characters with C substring.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __s C string value to insert.
* @param __n Number of characters from s to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the first @a __n characters of @a __s are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
const _CharT* __s, size_type __n)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
return this->replace(__i1 - begin(), __i2 - __i1, __s, __n);
}
/**
* @brief Replace range of characters with C string.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __s C string value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the characters of @a __s are inserted. If the length of
* result exceeds max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->replace(__i1, __i2, __s, traits_type::length(__s));
}
/**
* @brief Replace range of characters with multiple characters
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __n Number of characters to insert.
* @param __c Character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* @a __n copies of @a __c are inserted. If the length of
* result exceeds max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
replace(__const_iterator __i1, __const_iterator __i2, size_type __n,
_CharT __c)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c);
}
/**
* @brief Replace range of characters with range.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __k1 Iterator referencing start of range to insert.
* @param __k2 Iterator referencing end of range to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* characters in the range [__k1,__k2) are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
basic_string&
replace(const_iterator __i1, const_iterator __i2,
_InputIterator __k1, _InputIterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
std::__false_type());
}
#else
template<class _InputIterator>
#ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
typename __enable_if_not_native_iterator&#60_InputIterator&#62::__type
#else
basic_string&
#endif
replace(iterator __i1, iterator __i2,
_InputIterator __k1, _InputIterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
}
#endif
//\ Specializations\ for\ the\ common\ case\ of\ pointer\ and\ iterator:
//\ useful\ to\ avoid\ the\ overhead\ of\ temporary\ buffering\ in\ _M_replace\.
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
_CharT* __k1, _CharT* __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - begin(), __i2 - __i1,
__k1, __k2 - __k1);
}
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
const _CharT* __k1, const _CharT* __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - begin(), __i2 - __i1,
__k1, __k2 - __k1);
}
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
iterator __k1, iterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - begin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
}
basic_string&
replace(__const_iterator __i1, __const_iterator __i2,
const_iterator __k1, const_iterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
&& __i2 <= end());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - begin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Replace range of characters with initializer_list.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __l The initializer_list of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* characters in the range [__k1,__k2) are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
basic_string& replace(const_iterator __i1, const_iterator __i2,
initializer_list<_CharT> __l)
{ return this->replace(__i1, __i2, __l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Replace range of characters with string_view.
* @param __pos The position to replace at.
* @param __n The number of characters to replace.
* @param __svt The object convertible to string_view to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(size_type __pos, size_type __n, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->replace(__pos, __n, __sv.data(), __sv.size());
}
/**
* @brief Replace range of characters with string_view.
* @param __pos1 The position to replace at.
* @param __n1 The number of characters to replace.
* @param __svt The object convertible to string_view to insert from.
* @param __pos2 The position in the string_view to insert from.
* @param __n2 The number of characters to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(size_type __pos1, size_type __n1, const _Tp& __svt,
size_type __pos2, size_type __n2 = npos)
{
__sv_type __sv = __svt;
return this->replace(__pos1, __n1,
__sv.data()
+ std::__sv_check(__sv.size(), __pos2, "basic_string::replace"),
std::__sv_limit(__sv.size(), __pos2, __n2));
}
/**
* @brief Replace range of characters with string_view.
* @param __i1 An iterator referencing the start position
to replace at.
* @param __i2 An iterator referencing the end position
for the replace.
* @param __svt The object convertible to string_view to insert from.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(const_iterator __i1, const_iterator __i2, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->replace(__i1 - begin(), __i2 - __i1, __sv);
}
#endif // //\ C17 //\ C17
private:
template<class _Integer>
basic_string&
_M_replace_dispatch(const_iterator __i1, const_iterator __i2,
_Integer __n, _Integer __val, __true_type)
{ return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); }
template<class _InputIterator>
basic_string&
_M_replace_dispatch(const_iterator __i1, const_iterator __i2,
_InputIterator __k1, _InputIterator __k2,
__false_type);
basic_string&
_M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
_CharT __c);
basic_string&
_M_replace(size_type __pos, size_type __len1, const _CharT* __s,
const size_type __len2);
basic_string&
_M_append(const _CharT* __s, size_type __n);
public:
/**
* @brief Copy substring into C string.
* @param __s C string to copy value into.
* @param __n Number of characters to copy.
* @param __pos Index of first character to copy.
* @return Number of characters actually copied
* @throw std::out_of_range If __pos > size().
*
* Copies up to @a __n characters starting at @a __pos into the
* C string @a __s. If @a __pos is %greater than size(),
* out_of_range is thrown.
*/
size_type
copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
/**
* @brief Swap contents with another string.
* @param __s String to swap with.
*
* Exchanges the contents of this string with that of @a __s in constant
* time.
*/
void
swap(basic_string& __s) _GLIBCXX_NOEXCEPT;
//\ String\ operations:
/**
* @brief Return const pointer to null-terminated contents.
*
* This is a handle to internal data. Do not modify or dire things may
* happen.
*/
const _CharT*
c_str() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }
/**
* @brief Return const pointer to contents.
*
* This is a pointer to internal data. It is undefined to modify
* the contents through the returned pointer. To get a pointer that
* allows modifying the contents use @c &str[0] instead,
* (or in C++17 the non-const @c str.data() overload).
*/
const _CharT*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Return non-const pointer to contents.
*
* This is a pointer to the character sequence held by the string.
* Modifying the characters in the sequence is allowed.
*/
_CharT*
data() noexcept
{ return _M_data(); }
#endif
/**
* @brief Return copy of allocator used to construct this string.
*/
allocator_type
get_allocator() const _GLIBCXX_NOEXCEPT
{ return _M_get_allocator(); }
/**
* @brief Find position of a C substring.
* @param __s C string to locate.
* @param __pos Index of character to search from.
* @param __n Number of characters from @a s to search for.
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for the first @a
* __n characters in @a __s within this string. If found,
* returns the index where it begins. If not found, returns
* npos.
*/
size_type
find(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a string.
* @param __str String to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for value of @a __str within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type
find(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a string_view.
* @param __svt The object convertible to string_view to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find position of a C string.
* @param __s C string to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for the value of @a
* __s within this string. If found, returns the index where
* it begins. If not found, returns npos.
*/
size_type
find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a string.
* @param __str String to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for value of @a
* __str within this string. If found, returns the index where
* it begins. If not found, returns npos.
*/
size_type
rfind(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->rfind(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a string_view.
* @param __svt The object convertible to string_view to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of start of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
rfind(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->rfind(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a C substring.
* @param __s C string to locate.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to search for.
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for the first @a
* __n characters in @a __s within this string. If found,
* returns the index where it begins. If not found, returns
* npos.
*/
size_type
rfind(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a C string.
* @param __s C string to locate.
* @param __pos Index of character to start search at (default end).
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for the value of
* @a __s within this string. If found, returns the index
* where it begins. If not found, returns npos.
*/
size_type
rfind(const _CharT* __s, size_type __pos = npos) const
{
__glibcxx_requires_string(__s);
return this->rfind(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a character of string.
* @param __str String containing characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* characters of @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_first_of(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find_first_of(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a character of a string_view.
* @param __svt An object convertible to string_view containing
* characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_first_of(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_first_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find position of a character of C substring.
* @param __s String containing characters to locate.
* @param __pos Index of character to search from.
* @param __n Number of characters from s to search for.
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* first @a __n characters of @a __s within this string. If
* found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a character of C string.
* @param __s String containing characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* characters of @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_first_of(const _CharT* __s, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_first_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for the character
* @a __c within this string. If found, returns the index
* where it was found. If not found, returns npos.
*
* Note: equivalent to find(__c, __pos).
*/
size_type
find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
{ return this->find(__c, __pos); }
/**
* @brief Find last position of a character of string.
* @param __str String containing characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* characters of @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_of(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->find_last_of(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a character of string.
* @param __svt An object convertible to string_view containing
* characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_last_of(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_last_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a character of C substring.
* @param __s C string containing characters to locate.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to search for.
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* first @a __n characters of @a __s within this string. If
* found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a character of C string.
* @param __s C string containing characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* characters of @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_last_of(const _CharT* __s, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_last_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*
* Note: equivalent to rfind(__c, __pos).
*/
size_type
find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
{ return this->rfind(__c, __pos); }
/**
* @brief Find position of a character not in string.
* @param __str String containing characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not contained
* in @a __str within this string. If found, returns the index where it
* was found. If not found, returns npos.
*/
size_type
find_first_not_of(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find_first_not_of(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a character not in a string_view.
* @param __svt A object convertible to string_view containing
* characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_first_not_of(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_first_not_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find position of a character not in C substring.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search from.
* @param __n Number of characters from __s to consider.
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not
* contained in the first @a __n characters of @a __s within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find_first_not_of(const _CharT* __s, size_type __pos,
size_type __n) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a character not in C string.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not
* contained in @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_first_not_of(const _CharT* __s, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_first_not_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a different character.
* @param __c Character to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character
* other than @a __c within this string. If found, returns the
* index where it was found. If not found, returns npos.
*/
size_type
find_first_not_of(_CharT __c, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a character not in string.
* @param __str String containing characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character
* not contained in @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_not_of(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->find_last_not_of(__str.data(), __pos, __str.size()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a character not in a string_view.
* @param __svt An object convertible to string_view containing
* characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_last_not_of(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_last_not_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a character not in C substring.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to consider.
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character not
* contained in the first @a __n characters of @a __s within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_last_not_of(const _CharT* __s, size_type __pos,
size_type __n) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a character not in C string.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character
* not contained in @a __s within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_not_of(const _CharT* __s, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_last_not_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a different character.
* @param __c Character to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character other than
* @a __c within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find_last_not_of(_CharT __c, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Get a substring.
* @param __pos Index of first character (default 0).
* @param __n Number of characters in substring (default remainder).
* @return The new string.
* @throw std::out_of_range If __pos > size().
*
* Construct and return a new string using the @a __n
* characters starting at @a __pos. If the string is too
* short, use the remainder of the characters. If @a __pos is
* beyond the end of the string, out_of_range is thrown.
*/
basic_string
substr(size_type __pos = 0, size_type __n = npos) const
{ return basic_string(*this,
_M_check(__pos, "basic_string::substr"), __n); }
/**
* @brief Compare to a string.
* @param __str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a
* __str, 0 if their values are equivalent, or > 0 if this
* string is ordered after @a __str. Determines the effective
* length rlen of the strings to compare as the smallest of
* size() and str.size(). The function then compares the two
* strings by calling traits::compare(data(), str.data(),rlen).
* If the result of the comparison is nonzero returns it,
* otherwise the shorter one is ordered first.
*/
int
compare(const basic_string& __str) const
{
const size_type __size = this->size();
const size_type __osize = __str.size();
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Compare to a string_view.
* @param __svt An object convertible to string_view to compare against.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(const _Tp& __svt) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
const size_type __size = this->size();
const size_type __osize = __sv.size();
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __sv.data(), __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
/**
* @brief Compare to a string_view.
* @param __pos A position in the string to start comparing from.
* @param __n The number of characters to compare.
* @param __svt An object convertible to string_view to compare
* against.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(size_type __pos, size_type __n, const _Tp& __svt) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return __sv_type(*this).substr(__pos, __n).compare(__sv);
}
/**
* @brief Compare to a string_view.
* @param __pos1 A position in the string to start comparing from.
* @param __n1 The number of characters to compare.
* @param __svt An object convertible to string_view to compare
* against.
* @param __pos2 A position in the string_view to start comparing from.
* @param __n2 The number of characters to compare.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(size_type __pos1, size_type __n1, const _Tp& __svt,
size_type __pos2, size_type __n2 = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return __sv_type(*this)
.substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
}
#endif // //\ C17 //\ C17
/**
* @brief Compare substring to a string.
* @param __pos Index of first character of substring.
* @param __n Number of characters in substring.
* @param __str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n characters
* starting at @a __pos. Returns an integer < 0 if the
* substring is ordered before @a __str, 0 if their values are
* equivalent, or > 0 if the substring is ordered after @a
* __str. Determines the effective length rlen of the strings
* to compare as the smallest of the length of the substring
* and @a __str.size(). The function then compares the two
* strings by calling
* traits::compare(substring.data(),str.data(),rlen). If the
* result of the comparison is nonzero returns it, otherwise
* the shorter one is ordered first.
*/
int
compare(size_type __pos, size_type __n, const basic_string& __str) const;
/**
* @brief Compare substring to a substring.
* @param __pos1 Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __str String to compare against.
* @param __pos2 Index of first character of substring of str.
* @param __n2 Number of characters in substring of str.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a __pos1. Form the substring of @a
* __str from the @a __n2 characters starting at @a __pos2.
* Returns an integer < 0 if this substring is ordered before
* the substring of @a __str, 0 if their values are equivalent,
* or > 0 if this substring is ordered after the substring of
* @a __str. Determines the effective length rlen of the
* strings to compare as the smallest of the lengths of the
* substrings. The function then compares the two strings by
* calling
* traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
* If the result of the comparison is nonzero returns it,
* otherwise the shorter one is ordered first.
*/
int
compare(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2 = npos) const;
/**
* @brief Compare to a C string.
* @param __s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a __s, 0 if
* their values are equivalent, or > 0 if this string is ordered after
* @a __s. Determines the effective length rlen of the strings to
* compare as the smallest of size() and the length of a string
* constructed from @a __s. The function then compares the two strings
* by calling traits::compare(data(),s,rlen). If the result of the
* comparison is nonzero returns it, otherwise the shorter one is
* ordered first.
*/
int
compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT;
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 5\ String::compare\ specification\ questionable
/**
* @brief Compare substring to a C string.
* @param __pos Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a pos. Returns an integer < 0 if
* the substring is ordered before @a __s, 0 if their values
* are equivalent, or > 0 if the substring is ordered after @a
* __s. Determines the effective length rlen of the strings to
* compare as the smallest of the length of the substring and
* the length of a string constructed from @a __s. The
* function then compares the two string by calling
* traits::compare(substring.data(),__s,rlen). If the result of
* the comparison is nonzero returns it, otherwise the shorter
* one is ordered first.
*/
int
compare(size_type __pos, size_type __n1, const _CharT* __s) const;
/**
* @brief Compare substring against a character %array.
* @param __pos Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __s character %array to compare against.
* @param __n2 Number of characters of s.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a __pos. Form a string from the
* first @a __n2 characters of @a __s. Returns an integer < 0
* if this substring is ordered before the string from @a __s,
* 0 if their values are equivalent, or > 0 if this substring
* is ordered after the string from @a __s. Determines the
* effective length rlen of the strings to compare as the
* smallest of the length of the substring and @a __n2. The
* function then compares the two strings by calling
* traits::compare(substring.data(),s,rlen). If the result of
* the comparison is nonzero returns it, otherwise the shorter
* one is ordered first.
*
* NB: s must have at least n2 characters, '\\0' has
* no special meaning.
*/
int
compare(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2) const;
#if __cplusplus __cplusplus > __cplusplus > 201703L __cplusplus > 201703L __cplusplus > __cplusplus > 201703L __cplusplus > 201703L
bool
starts_with(basic_string_view<_CharT, _Traits> __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
starts_with(_CharT __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
starts_with(const _CharT* __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
ends_with(basic_string_view<_CharT, _Traits> __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
bool
ends_with(_CharT __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
bool
ends_with(const _CharT* __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
#endif // //\ C20 //\ C20
//\ Allow\ basic_stringbuf::__xfer_bufptrs\ to\ call\ _M_length:
template<typename, typename, typename> friend class basic_stringbuf;
};
_GLIBCXX_END_NAMESPACE_CXX11
#else // //\ !_GLIBCXX_USE_CXX11_ABI //\ !_GLIBCXX_USE_CXX11_ABI
//\ Reference\-counted\ COW\ string\ implentation
/**
* @class basic_string basic_string.h <string>
* @brief Managing sequences of characters and character-like objects.
*
* @ingroup strings
* @ingroup sequences
*
* @tparam _CharT Type of character
* @tparam _Traits Traits for character type, defaults to
* char_traits<_CharT>.
* @tparam _Alloc Allocator type, defaults to allocator<_CharT>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>. Of the
* <a href="tables.html#68">optional sequence requirements</a>, only
* @c push_back, @c at, and @c %array access are supported.
*
* @doctodo
*
*
* Documentation? What's that?
* Nathan Myers <ncm@cantrip.org>.
*
* A string looks like this:
*
* @code
* [_Rep]
* _M_length
* [basic_string<char_type>] _M_capacity
* _M_dataplus _M_refcount
* _M_p ----------------> unnamed array of char_type
* @endcode
*
* Where the _M_p points to the first character in the string, and
* you cast it to a pointer-to-_Rep and subtract 1 to get a
* pointer to the header.
*
* This approach has the enormous advantage that a string object
* requires only one allocation. All the ugliness is confined
* within a single %pair of inline functions, which each compile to
* a single @a add instruction: _Rep::_M_data(), and
* string::_M_rep(); and the allocation function which gets a
* block of raw bytes and with room enough and constructs a _Rep
* object at the front.
*
* The reason you want _M_data pointing to the character %array and
* not the _Rep is so that the debugger can see the string
* contents. (Probably we should add a non-inline member to get
* the _Rep for the debugger to use, so users can check the actual
* string length.)
*
* Note that the _Rep object is a POD so that you can have a
* static <em>empty string</em> _Rep object already @a constructed before
* static constructors have run. The reference-count encoding is
* chosen so that a 0 indicates one reference, so you never try to
* destroy the empty-string _Rep object.
*
* All but the last paragraph is considered pretty conventional
* for a C++ string implementation.
*/
//\ 21\.3\ \ Template\ class\ basic_string
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
typedef typename _<span class="namespc">Alloc</span>::template rebind&#60_CharT&#62::other _CharT_alloc_type;
//\ Types:
public:
typedef _Traits traits_type;
typedef typename _Traits::char_type value_type;
typedef _Alloc allocator_type;
typedef typename _CharT_alloc_type::size_type size_type;
typedef typename _CharT_alloc_type::difference_type difference_type;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
typedef typename _CharT_alloc_type::reference reference;
typedef typename _CharT_alloc_type::const_reference const_reference;
#else
typedef value_type& reference;
typedef const value_type& const_reference;
#endif
typedef typename _CharT_alloc_type::pointer pointer;
typedef typename _CharT_alloc_type::const_pointer const_pointer;
typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
protected:
//\ type\ used\ for\ positions\ in\ insert,\ erase\ etc\.
typedef iterator __const_iterator;
private:
//\ _Rep:\ string\ representation
//\ \ \ Invariants:
//\ \ \ 1\.\ String\ really\ contains\ _M_length\ \ 1\ characters:\ due\ to\ 21\.3\.4
//\ \ \ \ \ \ must\ be\ kept\ null\-terminated\.
//\ \ \ 2\.\ _M_capacity\ &\#62=\ _M_length
//\ \ \ \ \ \ Allocated\ memory\ is\ always\ \(_M_capacity\ \ 1\)\ \*\ sizeof\(_CharT\)\.
//\ \ \ 3\.\ _M_refcount\ has\ three\ states:
//\ \ \ \ \ \ \-1:\ leaked,\ one\ reference,\ no\ ref\-copies\ allowed,\ non\-const\.
//\ \ \ \ \ \ \ 0:\ one\ reference,\ non\-const\.
//\ \ \ \ \ n&\#620:\ n\ \ 1\ references,\ operations\ require\ a\ lock,\ const\.
//\ \ \ 4\.\ All\ fields==0\ is\ an\ empty\ string,\ given\ the\ extra\ storage
//\ \ \ \ \ \ beyond\-the\-end\ for\ a\ null\ terminator;\ thus,\ the\ shared
//\ \ \ \ \ \ empty\ string\ representation\ needs\ no\ constructor\.
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
struct _Rep : _Rep_base
{
//\ Types:
typedef typename _<span class="namespc">Alloc</span>::template rebind&#60char&#62::other _Raw_bytes_alloc;
//\ \(Public\)\ Data\ members:
//\ The\ maximum\ number\ of\ individual\ char_type\ elements\ of\ an
//\ individual\ string\ is\ determined\ by\ _S_max_size\.\ This\ is\ the
//\ value\ that\ will\ be\ returned\ by\ max_size\(\)\.\ \ \(Whereas\ npos
//\ is\ the\ maximum\ number\ of\ bytes\ the\ allocator\ can\ allocate\.\)
//\ If\ one\ was\ to\ divvy\ up\ the\ theoretical\ largest\ size\ string,
//\ with\ a\ terminating\ character\ and\ m\ _CharT\ elements,\ it'd
//\ look\ like\ this:
//\ npos\ =\ sizeof\(_Rep\)\ \ \(m\ \*\ sizeof\(_CharT\)\)\ \ sizeof\(_CharT\)
//\ Solving\ for\ m:
//\ m\ =\ \(\(npos\ \-\ sizeof\(_Rep\)\)/sizeof\(CharT\)\)\ \-\ 1
//\ In\ addition,\ this\ implementation\ quarters\ this\ amount\.
static const size_type _S_max_size;
static const _CharT _S_terminal;
//\ The\ following\ storage\ is\ init'd\ to\ 0\ by\ the\ linker,\ resulting
//\ \(carefully\)\ in\ an\ empty\ string\ with\ one\ reference\.
static size_type _S_empty_rep_storage[];
static _Rep&
_S_empty_rep() _GLIBCXX_NOEXCEPT
{
//\ NB:\ Mild\ hack\ to\ avoid\ strict\-aliasing\ warnings\.\ \ Note\ that
//\ _S_empty_rep_storage\ is\ never\ modified\ and\ the\ punning\ should
//\ be\ reasonably\ safe\ in\ this\ case\.
void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
return *reinterpret_cast<_Rep*>(__p);
}
bool
_M_is_leaked() const _GLIBCXX_NOEXCEPT
{
#if defined(__GTHREADS)
//\ _M_refcount\ is\ mutated\ concurrently\ by\ _M_refcopy/_M_dispose,
//\ so\ we\ need\ to\ use\ an\ atomic\ load\.\ However,\ _M_is_leaked
//\ predicate\ does\ not\ change\ concurrently\ \(i\.e\.\ the\ string\ is\ either
//\ leaked\ or\ not\),\ so\ a\ relaxed\ load\ is\ enough\.
return __atomic_load_n(&this->_M_refcount, __ATOMIC_RELAXED) < 0;
#else
return this->_M_refcount < 0;
#endif
}
bool
_M_is_shared() const _GLIBCXX_NOEXCEPT
{
#if defined(__GTHREADS)
//\ _M_refcount\ is\ mutated\ concurrently\ by\ _M_refcopy/_M_dispose,
//\ so\ we\ need\ to\ use\ an\ atomic\ load\.\ Another\ thread\ can\ drop\ last
//\ but\ one\ reference\ concurrently\ with\ this\ check,\ so\ we\ need\ this
//\ load\ to\ be\ acquire\ to\ synchronize\ with\ release\ fetch_and_add\ in
//\ _M_dispose\.
return __atomic_load_n(&this->_M_refcount, __ATOMIC_ACQUIRE) > 0;
#else
return this->_M_refcount > 0;
#endif
}
void
_M_set_leaked() _GLIBCXX_NOEXCEPT
{ this->_M_refcount = -1; }
void
_M_set_sharable() _GLIBCXX_NOEXCEPT
{ this->_M_refcount = 0; }
void
_M_set_length_and_sharable(size_type __n) _GLIBCXX_NOEXCEPT
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
{
this->_M_set_sharable(); //\ One\ reference\.
this->_M_length = __n;
traits_type::assign(this->_M_refdata()[__n], _S_terminal);
//\ grrr\.\ \(per\ 21\.3\.4\)
//\ You\ cannot\ leave\ those\ LWG\ people\ alone\ for\ a\ second\.
}
}
_CharT*
_M_refdata() throw()
{ return reinterpret_cast<_CharT*>(this + 1); }
_CharT*
_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
{
return (!_M_is_leaked() && __alloc1 == __alloc2)
? _M_refcopy() : _M_clone(__alloc1);
}
//\ Create\ &\ Destroy
static _Rep*
_S_create(size_type, size_type, const _Alloc&);
void
_M_dispose(const _Alloc& __a) _GLIBCXX_NOEXCEPT
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
{
//\ Be\ race\-detector\-friendly\.\ \ For\ more\ info\ see\ bits/cconfig\.
_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
//\ Decrement\ of\ _M_refcount\ is\ acq_rel,\ because:
//\ \-\ all\ but\ last\ decrements\ need\ to\ release\ to\ synchronize\ with
//\ \ \ the\ last\ decrement\ that\ will\ delete\ the\ object\.
//\ \-\ the\ last\ decrement\ needs\ to\ acquire\ to\ synchronize\ with
//\ \ \ all\ the\ previous\ decrements\.
//\ \-\ last\ but\ one\ decrement\ needs\ to\ release\ to\ synchronize\ with
//\ \ \ the\ acquire\ load\ in\ _M_is_shared\ that\ will\ conclude\ that
//\ \ \ the\ object\ is\ not\ shared\ anymore\.
if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
-1) <= 0)
{
_GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
_M_destroy(__a);
}
}
} //\ XXX\ MT
void
_M_destroy(const _Alloc&) throw();
_CharT*
_M_refcopy() throw()
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
__gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
return _M_refdata();
} //\ XXX\ MT
_CharT*
_M_clone(const _Alloc&, size_type __res = 0);
};
// Use empty-base optimization: http://www\.cantrip\.org/emptyopt\.html
struct _Alloc_hider : _Alloc
{
_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
: _Alloc(__a), _M_p(__dat) { }
_CharT* _M_p; //\ The\ actual\ data\.
};
public:
//\ Data\ Members\ \(public\):
//\ NB:\ This\ is\ an\ unsigned\ type,\ and\ thus\ represents\ the\ maximum
//\ size\ that\ the\ allocator\ can\ hold\.
///\ \ Value\ returned\ by\ various\ member\ functions\ when\ they\ fail\.
static const size_type npos = static_cast<size_type>(-1);
private:
//\ Data\ Members\ \(private\):
mutable _Alloc_hider _M_dataplus;
_CharT*
_M_data() const _GLIBCXX_NOEXCEPT
{ return _M_dataplus._M_p; }
_CharT*
_M_data(_CharT* __p) _GLIBCXX_NOEXCEPT
{ return (_M_dataplus._M_p = __p); }
_Rep*
_M_rep() const _GLIBCXX_NOEXCEPT
{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
//\ For\ the\ internal\ use\ we\ have\ functions\ similar\ to\ `begin'/`end'
//\ but\ they\ do\ not\ call\ _M_leak\.
iterator
_M_ibegin() const _GLIBCXX_NOEXCEPT
{ return iterator(_M_data()); }
iterator
_M_iend() const _GLIBCXX_NOEXCEPT
{ return iterator(_M_data() + this->size()); }
void
_M_leak() //\ for\ use\ in\ begin\(\)\ &\ non\-const\ op\[\]
{
if (!_M_rep()->_M_is_leaked())
_M_leak_hard();
}
size_type
_M_check(size_type __pos, const char* __s) const
{
if (__pos > this->size())
__throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
"this->size() (which is %zu)"),
__s, __pos, this->size());
return __pos;
}
void
_M_check_length(size_type __n1, size_type __n2, const char* __s) const
{
if (this->max_size() - (this->size() - __n1) < __n2)
__throw_length_error(__N(__s));
}
//\ NB:\ _M_limit\ doesn't\ check\ for\ a\ bad\ __pos\ value\.
size_type
_M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
{
const bool __testoff = __off < this->size() - __pos;
return __testoff ? __off : this->size() - __pos;
}
//\ True\ if\ _Rep\ and\ source\ do\ not\ overlap\.
bool
_M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
{
return (less<const _CharT*>()(__s, _M_data())
|| less<const _CharT*>()(_M_data() + this->size(), __s));
}
//\ When\ __n\ =\ 1\ way\ faster\ than\ the\ general\ multichar
//\ traits_type::copy/move/assign\.
static void
_M_copy(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
{
if (__n == 1)
traits_type::assign(*__d, *__s);
else
traits_type::copy(__d, __s, __n);
}
static void
_M_move(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
{
if (__n == 1)
traits_type::assign(*__d, *__s);
else
traits_type::move(__d, __s, __n);
}
static void
_M_assign(_CharT* __d, size_type __n, _CharT __c) _GLIBCXX_NOEXCEPT
{
if (__n == 1)
traits_type::assign(*__d, __c);
else
traits_type::assign(__d, __n, __c);
}
//\ _S_copy_chars\ is\ a\ separate\ template\ to\ permit\ specialization
//\ to\ optimize\ for\ the\ common\ case\ of\ pointers\ as\ iterators\.
template<class _Iterator>
static void
_S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
{
for (; __k1 != __k2; ++__k1, (void)++__p)
traits_type::assign(*__p, *__k1); //\ These\ types\ are\ off\.
}
static void
_S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
{ _S_copy_chars(__p, __k1.base(), __k2.base()); }
static void
_S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
_GLIBCXX_NOEXCEPT
{ _S_copy_chars(__p, __k1.base(), __k2.base()); }
static void
_S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
{ _M_copy(__p, __k1, __k2 - __k1); }
static void
_S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
_GLIBCXX_NOEXCEPT
{ _M_copy(__p, __k1, __k2 - __k1); }
static int
_S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
{
const difference_type __d = difference_type(__n1 - __n2);
if (__d &#62 __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__max)
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__max;
else if (__d &#60 __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__min)
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60int&#62::__min;
else
return int(__d);
}
void
_M_mutate(size_type __pos, size_type __len1, size_type __len2);
void
_M_leak_hard();
static _Rep&
_S_empty_rep() _GLIBCXX_NOEXCEPT
{ return _Rep::_S_empty_rep(); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
//\ A\ helper\ type\ for\ avoiding\ boiler\-plate\.
typedef basic_string_view<_CharT, _Traits> __sv_type;
template<typename _Tp, typename _Res>
using _If_sv = enable_if_t<
__and_<is_convertible<const _Tp&, __sv_type>,
__not_<is_convertible<const _Tp*, const basic_string*>>,
__not_&#60is_convertible&#60const _Tp&, const _CharT*&#62&#62&#62::value,
_Res>
//\ Allows\ an\ implicit\ conversion\ to\ __sv_type\.
static __sv_type
_S_to_string_view(__sv_type __svt) noexcept
{ return __svt; }
//\ Wraps\ a\ string_view\ by\ explicit\ conversion\ and\ thus
//\ allows\ to\ add\ an\ internal\ constructor\ that\ does\ not
//\ participate\ in\ overload\ resolution\ when\ a\ string_view
//\ is\ provided\.
struct __sv_wrapper
{
explicit __sv_wrapper(__sv_type __sv) noexcept : _M_sv(__sv) { }
__sv_type _M_sv;
};
/**
* @brief Only internally used: Construct string from a string view
* wrapper.
* @param __svw string view wrapper.
* @param __a Allocator to use.
*/
explicit
basic_string(__sv_wrapper __svw, const _Alloc& __a)
: basic_string(__svw._M_sv.data(), __svw._M_sv.size(), __a) { }
#endif
public:
//\ Construct/copy/destroy:
//\ NB:\ We\ overload\ ctors\ in\ some\ cases\ instead\ of\ using\ default
//\ arguments,\ per\ 17\.4\.4\.4\ para\.\ 2\ item\ 2\.
/**
* @brief Default constructor creates an empty string.
*/
basic_string()
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
_GLIBCXX_NOEXCEPT
: _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc())
#else
: _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc())
#endif
{ }
/**
* @brief Construct an empty string using allocator @a a.
*/
explicit
basic_string(const _Alloc& __a);
//\ NB:\ per\ LWG\ issue\ 42,\ semantics\ different\ from\ IS:
/**
* @brief Construct string with copy of value of @a str.
* @param __str Source string.
*/
basic_string(const basic_string& __str);
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2583\.\ no\ way\ to\ supply\ an\ allocator\ for\ basic_string\(str,\ pos\)
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __a Allocator to use.
*/
basic_string(const basic_string& __str, size_type __pos,
const _Alloc& __a = _Alloc());
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __n Number of characters to copy.
*/
basic_string(const basic_string& __str, size_type __pos,
size_type __n);
/**
* @brief Construct string as copy of a substring.
* @param __str Source string.
* @param __pos Index of first character to copy from.
* @param __n Number of characters to copy.
* @param __a Allocator to use.
*/
basic_string(const basic_string& __str, size_type __pos,
size_type __n, const _Alloc& __a);
/**
* @brief Construct string initialized by a character %array.
* @param __s Source character %array.
* @param __n Number of characters to copy.
* @param __a Allocator to use (default is default allocator).
*
* NB: @a __s must have at least @a __n characters, '\\0'
* has no special meaning.
*/
basic_string(const _CharT* __s, size_type __n,
const _Alloc& __a = _Alloc());
/**
* @brief Construct string as copy of a C string.
* @param __s Source C string.
* @param __a Allocator to use (default is default allocator).
*/
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
/**
* @brief Construct string as multiple characters.
* @param __n Number of characters.
* @param __c Character to use.
* @param __a Allocator to use (default is default allocator).
*/
basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Move construct string.
* @param __str Source string.
*
* The newly-created string contains the exact contents of @a __str.
* @a __str is a valid, but unspecified string.
**/
basic_string(basic_string&& __str)
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
noexcept //\ FIXME\ C11:\ should\ always\ be\ noexcept\.
#endif
: _M_dataplus(std::move(__str._M_dataplus))
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
__str._M_data(_S_empty_rep()._M_refdata());
#else
__str._M_data(_S_construct(size_type(), _CharT(), get_allocator()));
#endif
}
/**
* @brief Construct string from an initializer %list.
* @param __l std::initializer_list of characters.
* @param __a Allocator to use (default is default allocator).
*/
basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
basic_string(const basic_string& __str, const _Alloc& __a)
: _M_dataplus(__str._M_rep()->_M_grab(__a, __str.get_allocator()), __a)
{ }
basic_string(basic_string&& __str, const _Alloc& __a)
: _M_dataplus(__str._M_data(), __a)
{
if (__a == __str.get_allocator())
{
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
__str._M_data(_S_empty_rep()._M_refdata());
#else
__str._M_data(_S_construct(size_type(), _CharT(), __a));
#endif
}
else
_M_dataplus._M_p = _S_construct(__str.begin(), __str.end(), __a);
}
#endif // //\ C11 //\ C11
/**
* @brief Construct string as copy of a range.
* @param __beg Start of range.
* @param __end End of range.
* @param __a Allocator to use (default is default allocator).
*/
template<class _InputIterator>
basic_string(_InputIterator __beg, _InputIterator __end,
const _Alloc& __a = _Alloc());
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Construct string from a substring of a string_view.
* @param __t Source object convertible to string view.
* @param __pos The index of the first character to copy from __t.
* @param __n The number of characters to copy from __t.
* @param __a Allocator to use.
*/
template<typename _Tp, typename = _If_sv<_Tp, void>>
basic_string(const _Tp& __t, size_type __pos, size_type __n,
const _Alloc& __a = _Alloc())
: basic_string(_S_to_string_view(__t).substr(__pos, __n), __a) { }
/**
* @brief Construct string from a string_view.
* @param __t Source object convertible to string view.
* @param __a Allocator to use (default is default allocator).
*/
template<typename _Tp, typename = _If_sv<_Tp, void>>
explicit
basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
: basic_string(__sv_wrapper(_S_to_string_view(__t)), __a) { }
#endif // //\ C17 //\ C17
/**
* @brief Destroy the string instance.
*/
~basic_string() _GLIBCXX_NOEXCEPT
{ _M_rep()->_M_dispose(this->get_allocator()); }
/**
* @brief Assign the value of @a str to this string.
* @param __str Source string.
*/
basic_string&
operator=(const basic_string& __str)
{ return this->assign(__str); }
/**
* @brief Copy contents of @a s into this string.
* @param __s Source null-terminated string.
*/
basic_string&
operator=(const _CharT* __s)
{ return this->assign(__s); }
/**
* @brief Set value to string of length 1.
* @param __c Source character.
*
* Assigning to a character makes this string length 1 and
* (*this)[0] == @a c.
*/
basic_string&
operator=(_CharT __c)
{
this->assign(1, __c);
return *this;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Move assign the value of @a str to this string.
* @param __str Source string.
*
* The contents of @a str are moved into this string (without copying).
* @a str is a valid, but unspecified string.
**/
basic_string&
operator=(basic_string&& __str)
_GLIBCXX_NOEXCEPT_IF(allocator_traits&#60_Alloc&#62::is_always_equal::value)
{
//\ NB:\ DR\ 1204\.
this->swap(__str);
return *this;
}
/**
* @brief Set value to string constructed from initializer %list.
* @param __l std::initializer_list.
*/
basic_string&
operator=(initializer_list<_CharT> __l)
{
this->assign(__l.begin(), __l.size());
return *this;
}
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Set value to string constructed from a string_view.
* @param __svt An object convertible to string_view.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
operator=(const _Tp& __svt)
{ return this->assign(__svt); }
/**
* @brief Convert to a string_view.
* @return A string_view.
*/
operator __sv_type() const noexcept
{ return __sv_type(data(), size()); }
#endif // //\ C17 //\ C17
//\ Iterators:
/**
* Returns a read/write iterator that points to the first character in
* the %string. Unshares the string.
*/
iterator
begin() //\ FIXME\ C11:\ should\ be\ noexcept\.
{
_M_leak();
return iterator(_M_data());
}
/**
* Returns a read-only (constant) iterator that points to the first
* character in the %string.
*/
const_iterator
begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_M_data()); }
/**
* Returns a read/write iterator that points one past the last
* character in the %string. Unshares the string.
*/
iterator
end() //\ FIXME\ C11:\ should\ be\ noexcept\.
{
_M_leak();
return iterator(_M_data() + this->size());
}
/**
* Returns a read-only (constant) iterator that points one past the
* last character in the %string.
*/
const_iterator
end() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_M_data() + this->size()); }
/**
* Returns a read/write reverse iterator that points to the last
* character in the %string. Iteration is done in reverse element
* order. Unshares the string.
*/
reverse_iterator
rbegin() //\ FIXME\ C11:\ should\ be\ noexcept\.
{ return reverse_iterator(this->end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last character in the %string. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
rbegin() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(this->end()); }
/**
* Returns a read/write reverse iterator that points to one before the
* first character in the %string. Iteration is done in reverse
* element order. Unshares the string.
*/
reverse_iterator
rend() //\ FIXME\ C11:\ should\ be\ noexcept\.
{ return reverse_iterator(this->begin()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first character in the %string. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
rend() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(this->begin()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read-only (constant) iterator that points to the first
* character in the %string.
*/
const_iterator
cbegin() const noexcept
{ return const_iterator(this->_M_data()); }
/**
* Returns a read-only (constant) iterator that points one past the
* last character in the %string.
*/
const_iterator
cend() const noexcept
{ return const_iterator(this->_M_data() + this->size()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to the last character in the %string. Iteration is done in
* reverse element order.
*/
const_reverse_iterator
crbegin() const noexcept
{ return const_reverse_iterator(this->end()); }
/**
* Returns a read-only (constant) reverse iterator that points
* to one before the first character in the %string. Iteration
* is done in reverse element order.
*/
const_reverse_iterator
crend() const noexcept
{ return const_reverse_iterator(this->begin()); }
#endif
public:
//\ Capacity:
///\ \ Returns\ the\ number\ of\ characters\ in\ the\ string,\ not\ including\ any
///\ \ null\-termination\.
size_type
size() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_length; }
///\ \ Returns\ the\ number\ of\ characters\ in\ the\ string,\ not\ including\ any
///\ \ null\-termination\.
size_type
length() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_length; }
///\ \ Returns\ the\ size\(\)\ of\ the\ largest\ possible\ %string\.
size_type
max_size() const _GLIBCXX_NOEXCEPT
{ return _Rep::_S_max_size; }
/**
* @brief Resizes the %string to the specified number of characters.
* @param __n Number of characters the %string should contain.
* @param __c Character to fill any new elements.
*
* This function will %resize the %string to the specified
* number of characters. If the number is smaller than the
* %string's current size the %string is truncated, otherwise
* the %string is extended and new elements are %set to @a __c.
*/
void
resize(size_type __n, _CharT __c);
/**
* @brief Resizes the %string to the specified number of characters.
* @param __n Number of characters the %string should contain.
*
* This function will resize the %string to the specified length. If
* the new size is smaller than the %string's current size the %string
* is truncated, otherwise the %string is extended and new characters
* are default-constructed. For basic types such as char, this means
* setting them to 0.
*/
void
resize(size_type __n)
{ this->resize(__n, _CharT()); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
///\ \ A\ non\-binding\ request\ to\ reduce\ capacity\(\)\ to\ size\(\)\.
void
shrink_to_fit() _GLIBCXX_NOEXCEPT
{
#if __cpp_exceptions
if (capacity() > size())
{
try
{ reserve(0); }
catch(...)
{ }
}
#endif
}
#endif
/**
* Returns the total number of characters that the %string can hold
* before needing to allocate more memory.
*/
size_type
capacity() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_capacity; }
/**
* @brief Attempt to preallocate enough memory for specified number of
* characters.
* @param __res_arg Number of characters required.
* @throw std::length_error If @a __res_arg exceeds @c max_size().
*
* This function attempts to reserve enough memory for the
* %string to hold the specified number of characters. If the
* number requested is more than max_size(), length_error is
* thrown.
*
* The advantage of this function is that if optimal code is a
* necessity and the user can determine the string length that will be
* required, the user can reserve the memory in %advance, and thus
* prevent a possible reallocation of memory and copying of %string
* data.
*/
void
reserve(size_type __res_arg = 0);
/**
* Erases the string, making it empty.
*/
#if _GLIBCXX_FULLY_DYNAMIC_STRING _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == _GLIBCXX_FULLY_DYNAMIC_STRING == 0 _GLIBCXX_FULLY_DYNAMIC_STRING == 0
void
clear() _GLIBCXX_NOEXCEPT
{
if (_M_rep()->_M_is_shared())
{
_M_rep()->_M_dispose(this->get_allocator());
_M_data(_S_empty_rep()._M_refdata());
}
else
_M_rep()->_M_set_length_and_sharable(0);
}
#else
//\ PR\ 56166:\ this\ should\ not\ throw\.
void
clear()
{ _M_mutate(0, this->size(), 0); }
#endif
/**
* Returns true if the %string is empty. Equivalent to
* <code>*this == ""</code>.
*/
_GLIBCXX_NODISCARD bool
empty() const _GLIBCXX_NOEXCEPT
{ return this->size() == 0; }
//\ Element\ access:
/**
* @brief Subscript access to the data contained in the %string.
* @param __pos The index of the character to access.
* @return Read-only (constant) reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
const_reference
operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
{
__glibcxx_assert(__pos <= size());
return _M_data()[__pos];
}
/**
* @brief Subscript access to the data contained in the %string.
* @param __pos The index of the character to access.
* @return Read/write reference to the character.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().) Unshares the string.
*/
reference
operator[](size_type __pos)
{
//\ Allow\ pos\ ==\ size\(\)\ both\ in\ C98\ mode,\ as\ v3\ extension,
//\ and\ in\ C11\ mode\.
__glibcxx_assert(__pos <= size());
//\ In\ pedantic\ mode\ be\ strict\ in\ C98\ mode\.
_GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
_M_leak();
return _M_data()[__pos];
}
/**
* @brief Provides access to the data contained in the %string.
* @param __n The index of the character to access.
* @return Read-only (const) reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails.
*/
const_reference
at(size_type __n) const
{
if (__n >= this->size())
__throw_out_of_range_fmt(__N("basic_string::at: __n "
"(which is %zu) >= this->size() "
"(which is %zu)"),
__n, this->size());
return _M_data()[__n];
}
/**
* @brief Provides access to the data contained in the %string.
* @param __n The index of the character to access.
* @return Read/write reference to the character.
* @throw std::out_of_range If @a n is an invalid index.
*
* This function provides for safer data access. The parameter is
* first checked that it is in the range of the string. The function
* throws out_of_range if the check fails. Success results in
* unsharing the string.
*/
reference
at(size_type __n)
{
if (__n >= size())
__throw_out_of_range_fmt(__N("basic_string::at: __n "
"(which is %zu) >= this->size() "
"(which is %zu)"),
__n, this->size());
_M_leak();
return _M_data()[__n];
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* Returns a read/write reference to the data at the first
* element of the %string.
*/
reference
front()
{
__glibcxx_assert(!empty());
return operator[](0);
}
/**
* Returns a read-only (constant) reference to the data at the first
* element of the %string.
*/
const_reference
front() const noexcept
{
__glibcxx_assert(!empty());
return operator[](0);
}
/**
* Returns a read/write reference to the data at the last
* element of the %string.
*/
reference
back()
{
__glibcxx_assert(!empty());
return operator[](this->size() - 1);
}
/**
* Returns a read-only (constant) reference to the data at the
* last element of the %string.
*/
const_reference
back() const noexcept
{
__glibcxx_assert(!empty());
return operator[](this->size() - 1);
}
#endif
//\ Modifiers:
/**
* @brief Append a string to this string.
* @param __str The string to append.
* @return Reference to this string.
*/
basic_string&
operator+=(const basic_string& __str)
{ return this->append(__str); }
/**
* @brief Append a C string.
* @param __s The C string to append.
* @return Reference to this string.
*/
basic_string&
operator+=(const _CharT* __s)
{ return this->append(__s); }
/**
* @brief Append a character.
* @param __c The character to append.
* @return Reference to this string.
*/
basic_string&
operator+=(_CharT __c)
{
this->push_back(__c);
return *this;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Append an initializer_list of characters.
* @param __l The initializer_list of characters to be appended.
* @return Reference to this string.
*/
basic_string&
operator+=(initializer_list<_CharT> __l)
{ return this->append(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Append a string_view.
* @param __svt The object convertible to string_view to be appended.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
operator+=(const _Tp& __svt)
{ return this->append(__svt); }
#endif // //\ C17 //\ C17
/**
* @brief Append a string to this string.
* @param __str The string to append.
* @return Reference to this string.
*/
basic_string&
append(const basic_string& __str);
/**
* @brief Append a substring.
* @param __str The string to append.
* @param __pos Index of the first character of str to append.
* @param __n The number of characters to append.
* @return Reference to this string.
* @throw std::out_of_range if @a __pos is not a valid index.
*
* This function appends @a __n characters from @a __str
* starting at @a __pos to this string. If @a __n is is larger
* than the number of available characters in @a __str, the
* remainder of @a __str is appended.
*/
basic_string&
append(const basic_string& __str, size_type __pos, size_type __n = npos);
/**
* @brief Append a C substring.
* @param __s The C string to append.
* @param __n The number of characters to append.
* @return Reference to this string.
*/
basic_string&
append(const _CharT* __s, size_type __n);
/**
* @brief Append a C string.
* @param __s The C string to append.
* @return Reference to this string.
*/
basic_string&
append(const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->append(__s, traits_type::length(__s));
}
/**
* @brief Append multiple characters.
* @param __n The number of characters to append.
* @param __c The character to use.
* @return Reference to this string.
*
* Appends __n copies of __c to this string.
*/
basic_string&
append(size_type __n, _CharT __c);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Append an initializer_list of characters.
* @param __l The initializer_list of characters to append.
* @return Reference to this string.
*/
basic_string&
append(initializer_list<_CharT> __l)
{ return this->append(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
/**
* @brief Append a range of characters.
* @param __first Iterator referencing the first character to append.
* @param __last Iterator marking the end of the range.
* @return Reference to this string.
*
* Appends characters in the range [__first,__last) to this string.
*/
template<class _InputIterator>
basic_string&
append(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_iend(), _M_iend(), __first, __last); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Append a string_view.
* @param __svt The object convertible to string_view to be appended.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
append(const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->append(__sv.data(), __sv.size());
}
/**
* @brief Append a range of characters from a string_view.
* @param __svt The object convertible to string_view to be appended
* from.
* @param __pos The position in the string_view to append from.
* @param __n The number of characters to append from the string_view.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
append(const _Tp& __svt, size_type __pos, size_type __n = npos)
{
__sv_type __sv = __svt;
return append(__sv.data()
+ std::__sv_check(__sv.size(), __pos, "basic_string::append"),
std::__sv_limit(__sv.size(), __pos, __n));
}
#endif // //\ C17 //\ C17
/**
* @brief Append a single character.
* @param __c Character to append.
*/
void
push_back(_CharT __c)
{
const size_type __len = 1 + this->size();
if (__len > this->capacity() || _M_rep()->_M_is_shared())
this->reserve(__len);
traits_type::assign(_M_data()[this->size()], __c);
_M_rep()->_M_set_length_and_sharable(__len);
}
/**
* @brief Set value to contents of another string.
* @param __str Source string to use.
* @return Reference to this string.
*/
basic_string&
assign(const basic_string& __str);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Set value to contents of another string.
* @param __str Source string to use.
* @return Reference to this string.
*
* This function sets this string to the exact contents of @a __str.
* @a __str is a valid, but unspecified string.
*/
basic_string&
assign(basic_string&& __str)
noexcept(allocator_traits&#60_Alloc&#62::is_always_equal::value)
{
this->swap(__str);
return *this;
}
#endif // //\ C11 //\ C11
/**
* @brief Set value to a substring of a string.
* @param __str The string to use.
* @param __pos Index of the first character of str.
* @param __n Number of characters to use.
* @return Reference to this string.
* @throw std::out_of_range if @a pos is not a valid index.
*
* This function sets this string to the substring of @a __str
* consisting of @a __n characters at @a __pos. If @a __n is
* is larger than the number of available characters in @a
* __str, the remainder of @a __str is used.
*/
basic_string&
assign(const basic_string& __str, size_type __pos, size_type __n = npos)
{ return this->assign(__str._M_data()
+ __str._M_check(__pos, "basic_string::assign"),
__str._M_limit(__pos, __n)); }
/**
* @brief Set value to a C substring.
* @param __s The C string to use.
* @param __n Number of characters to use.
* @return Reference to this string.
*
* This function sets the value of this string to the first @a __n
* characters of @a __s. If @a __n is is larger than the number of
* available characters in @a __s, the remainder of @a __s is used.
*/
basic_string&
assign(const _CharT* __s, size_type __n);
/**
* @brief Set value to contents of a C string.
* @param __s The C string to use.
* @return Reference to this string.
*
* This function sets the value of this string to the value of @a __s.
* The data is copied, so there is no dependence on @a __s once the
* function returns.
*/
basic_string&
assign(const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->assign(__s, traits_type::length(__s));
}
/**
* @brief Set value to multiple characters.
* @param __n Length of the resulting string.
* @param __c The character to use.
* @return Reference to this string.
*
* This function sets the value of this string to @a __n copies of
* character @a __c.
*/
basic_string&
assign(size_type __n, _CharT __c)
{ return _M_replace_aux(size_type(0), this->size(), __n, __c); }
/**
* @brief Set value to a range of characters.
* @param __first Iterator referencing the first character to append.
* @param __last Iterator marking the end of the range.
* @return Reference to this string.
*
* Sets value of string to characters in the range [__first,__last).
*/
template<class _InputIterator>
basic_string&
assign(_InputIterator __first, _InputIterator __last)
{ return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Set value to an initializer_list of characters.
* @param __l The initializer_list of characters to assign.
* @return Reference to this string.
*/
basic_string&
assign(initializer_list<_CharT> __l)
{ return this->assign(__l.begin(), __l.size()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Set value from a string_view.
* @param __svt The source object convertible to string_view.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
assign(const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->assign(__sv.data(), __sv.size());
}
/**
* @brief Set value from a range of characters in a string_view.
* @param __svt The source object convertible to string_view.
* @param __pos The position in the string_view to assign from.
* @param __n The number of characters to assign.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
assign(const _Tp& __svt, size_type __pos, size_type __n = npos)
{
__sv_type __sv = __svt;
return assign(__sv.data()
+ std::__sv_check(__sv.size(), __pos, "basic_string::assign"),
std::__sv_limit(__sv.size(), __pos, __n));
}
#endif // //\ C17 //\ C17
/**
* @brief Insert multiple characters.
* @param __p Iterator referencing location in string to insert at.
* @param __n Number of characters to insert
* @param __c The character to insert.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts @a __n copies of character @a __c starting at the
* position referenced by iterator @a __p. If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
void
insert(iterator __p, size_type __n, _CharT __c)
{ this->replace(__p, __p, __n, __c); }
/**
* @brief Insert a range of characters.
* @param __p Iterator referencing location in string to insert at.
* @param __beg Start of range.
* @param __end End of range.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts characters in range [__beg,__end). If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
template<class _InputIterator>
void
insert(iterator __p, _InputIterator __beg, _InputIterator __end)
{ this->replace(__p, __p, __beg, __end); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Insert an initializer_list of characters.
* @param __p Iterator referencing location in string to insert at.
* @param __l The initializer_list of characters to insert.
* @throw std::length_error If new length exceeds @c max_size().
*/
void
insert(iterator __p, initializer_list<_CharT> __l)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
this->insert(__p - _M_ibegin(), __l.begin(), __l.size());
}
#endif // //\ C11 //\ C11
/**
* @brief Insert value of a string.
* @param __pos1 Iterator referencing location in string to insert at.
* @param __str The string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts value of @a __str starting at @a __pos1. If adding
* characters causes the length to exceed max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
insert(size_type __pos1, const basic_string& __str)
{ return this->insert(__pos1, __str, size_type(0), __str.size()); }
/**
* @brief Insert a substring.
* @param __pos1 Iterator referencing location in string to insert at.
* @param __str The string to insert.
* @param __pos2 Start of characters in str to insert.
* @param __n Number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos1 > size() or
* @a __pos2 > @a str.size().
*
* Starting at @a pos1, insert @a __n character of @a __str
* beginning with @a __pos2. If adding characters causes the
* length to exceed max_size(), length_error is thrown. If @a
* __pos1 is beyond the end of this string or @a __pos2 is
* beyond the end of @a __str, out_of_range is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
insert(size_type __pos1, const basic_string& __str,
size_type __pos2, size_type __n = npos)
{ return this->insert(__pos1, __str._M_data()
+ __str._M_check(__pos2, "basic_string::insert"),
__str._M_limit(__pos2, __n)); }
/**
* @brief Insert a C substring.
* @param __pos Iterator referencing location in string to insert at.
* @param __s The C string to insert.
* @param __n The number of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a __pos is beyond the end of this
* string.
*
* Inserts the first @a __n characters of @a __s starting at @a
* __pos. If adding characters causes the length to exceed
* max_size(), length_error is thrown. If @a __pos is beyond
* end(), out_of_range is thrown. The value of the string
* doesn't change if an error is thrown.
*/
basic_string&
insert(size_type __pos, const _CharT* __s, size_type __n);
/**
* @brief Insert a C string.
* @param __pos Iterator referencing location in string to insert at.
* @param __s The C string to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Inserts the first @a n characters of @a __s starting at @a __pos. If
* adding characters causes the length to exceed max_size(),
* length_error is thrown. If @a __pos is beyond end(), out_of_range is
* thrown. The value of the string doesn't change if an error is
* thrown.
*/
basic_string&
insert(size_type __pos, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->insert(__pos, __s, traits_type::length(__s));
}
/**
* @brief Insert multiple characters.
* @param __pos Index in string to insert at.
* @param __n Number of characters to insert
* @param __c The character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
* @throw std::out_of_range If @a __pos is beyond the end of this
* string.
*
* Inserts @a __n copies of character @a __c starting at index
* @a __pos. If adding characters causes the length to exceed
* max_size(), length_error is thrown. If @a __pos > length(),
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
insert(size_type __pos, size_type __n, _CharT __c)
{ return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
size_type(0), __n, __c); }
/**
* @brief Insert one character.
* @param __p Iterator referencing position in string to insert at.
* @param __c The character to insert.
* @return Iterator referencing newly inserted char.
* @throw std::length_error If new length exceeds @c max_size().
*
* Inserts character @a __c at position referenced by @a __p.
* If adding character causes the length to exceed max_size(),
* length_error is thrown. If @a __p is beyond end of string,
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
iterator
insert(iterator __p, _CharT __c)
{
_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
const size_type __pos = __p - _M_ibegin();
_M_replace_aux(__pos, size_type(0), size_type(1), __c);
_M_rep()->_M_set_leaked();
return iterator(_M_data() + __pos);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Insert a string_view.
* @param __pos Iterator referencing position in string to insert at.
* @param __svt The object convertible to string_view to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
insert(size_type __pos, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->insert(__pos, __sv.data(), __sv.size());
}
/**
* @brief Insert a string_view.
* @param __pos Iterator referencing position in string to insert at.
* @param __svt The object convertible to string_view to insert from.
* @param __pos Iterator referencing position in string_view to insert
* from.
* @param __n The number of characters to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
insert(size_type __pos1, const _Tp& __svt,
size_type __pos2, size_type __n = npos)
{
__sv_type __sv = __svt;
return this->replace(__pos1, size_type(0), __sv.data()
+ std::__sv_check(__sv.size(), __pos2, "basic_string::insert"),
std::__sv_limit(__sv.size(), __pos2, __n));
}
#endif // //\ C17 //\ C17
/**
* @brief Remove characters.
* @param __pos Index of first character to remove (default 0).
* @param __n Number of characters to remove (default remainder).
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
*
* Removes @a __n characters from this string starting at @a
* __pos. The length of the string is reduced by @a __n. If
* there are < @a __n characters to remove, the remainder of
* the string is truncated. If @a __p is beyond end of string,
* out_of_range is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
erase(size_type __pos = 0, size_type __n = npos)
{
_M_mutate(_M_check(__pos, "basic_string::erase"),
_M_limit(__pos, __n), size_type(0));
return *this;
}
/**
* @brief Remove one character.
* @param __position Iterator referencing the character to remove.
* @return iterator referencing same location after removal.
*
* Removes the character at @a __position from this string. The value
* of the string doesn't change if an error is thrown.
*/
iterator
erase(iterator __position)
{
_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
&& __position < _M_iend());
const size_type __pos = __position - _M_ibegin();
_M_mutate(__pos, size_type(1), size_type(0));
_M_rep()->_M_set_leaked();
return iterator(_M_data() + __pos);
}
/**
* @brief Remove a range of characters.
* @param __first Iterator referencing the first character to remove.
* @param __last Iterator referencing the end of the range.
* @return Iterator referencing location of first after removal.
*
* Removes the characters in the range [first,last) from this string.
* The value of the string doesn't change if an error is thrown.
*/
iterator
erase(iterator __first, iterator __last);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Remove the last character.
*
* The string must be non-empty.
*/
void
pop_back() //\ FIXME\ C11:\ should\ be\ noexcept\.
{
__glibcxx_assert(!empty());
erase(size() - 1, 1);
}
#endif // //\ C11 //\ C11
/**
* @brief Replace characters with value from another string.
* @param __pos Index of first character to replace.
* @param __n Number of characters to be replaced.
* @param __str String to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos is beyond the end of this
* string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos+__n) from
* this string. In place, the value of @a __str is inserted.
* If @a __pos is beyond end of string, out_of_range is thrown.
* If the length of the result exceeds max_size(), length_error
* is thrown. The value of the string doesn't change if an
* error is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n, const basic_string& __str)
{ return this->replace(__pos, __n, __str._M_data(), __str.size()); }
/**
* @brief Replace characters with value from another string.
* @param __pos1 Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __str String to insert.
* @param __pos2 Index of first character of str to use.
* @param __n2 Number of characters from str to use.
* @return Reference to this string.
* @throw std::out_of_range If @a __pos1 > size() or @a __pos2 >
* __str.size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos1,__pos1 + n) from this
* string. In place, the value of @a __str is inserted. If @a __pos is
* beyond end of string, out_of_range is thrown. If the length of the
* result exceeds max_size(), length_error is thrown. The value of the
* string doesn't change if an error is thrown.
*/
basic_string&
replace(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2 = npos)
{ return this->replace(__pos1, __n1, __str._M_data()
+ __str._M_check(__pos2, "basic_string::replace"),
__str._M_limit(__pos2, __n2)); }
/**
* @brief Replace characters with value of a C substring.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __s C string to insert.
* @param __n2 Number of characters from @a s to use.
* @return Reference to this string.
* @throw std::out_of_range If @a pos1 > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos + __n1)
* from this string. In place, the first @a __n2 characters of
* @a __s are inserted, or all of @a __s if @a __n2 is too large. If
* @a __pos is beyond end of string, out_of_range is thrown. If
* the length of result exceeds max_size(), length_error is
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2);
/**
* @brief Replace characters with value of a C string.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __s C string to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__pos,__pos + __n1)
* from this string. In place, the characters of @a __s are
* inserted. If @a __pos is beyond end of string, out_of_range
* is thrown. If the length of result exceeds max_size(),
* length_error is thrown. The value of the string doesn't
* change if an error is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->replace(__pos, __n1, __s, traits_type::length(__s));
}
/**
* @brief Replace characters with multiple characters.
* @param __pos Index of first character to replace.
* @param __n1 Number of characters to be replaced.
* @param __n2 Number of characters to insert.
* @param __c Character to insert.
* @return Reference to this string.
* @throw std::out_of_range If @a __pos > size().
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [pos,pos + n1) from this
* string. In place, @a __n2 copies of @a __c are inserted.
* If @a __pos is beyond end of string, out_of_range is thrown.
* If the length of result exceeds max_size(), length_error is
* thrown. The value of the string doesn't change if an error
* is thrown.
*/
basic_string&
replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
{ return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
_M_limit(__pos, __n1), __n2, __c); }
/**
* @brief Replace range of characters with string.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __str String value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the value of @a __str is inserted. If the length of result
* exceeds max_size(), length_error is thrown. The value of
* the string doesn't change if an error is thrown.
*/
basic_string&
replace(iterator __i1, iterator __i2, const basic_string& __str)
{ return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
/**
* @brief Replace range of characters with C substring.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __s C string value to insert.
* @param __n Number of characters from s to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the first @a __n characters of @a __s are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
basic_string&
replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
}
/**
* @brief Replace range of characters with C string.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __s C string value to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* the characters of @a __s are inserted. If the length of
* result exceeds max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
replace(iterator __i1, iterator __i2, const _CharT* __s)
{
__glibcxx_requires_string(__s);
return this->replace(__i1, __i2, __s, traits_type::length(__s));
}
/**
* @brief Replace range of characters with multiple characters
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __n Number of characters to insert.
* @param __c Character to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* @a __n copies of @a __c are inserted. If the length of
* result exceeds max_size(), length_error is thrown. The
* value of the string doesn't change if an error is thrown.
*/
basic_string&
replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
}
/**
* @brief Replace range of characters with range.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __k1 Iterator referencing start of range to insert.
* @param __k2 Iterator referencing end of range to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* characters in the range [__k1,__k2) are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
template<class _InputIterator>
basic_string&
replace(iterator __i1, iterator __i2,
_InputIterator __k1, _InputIterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
__glibcxx_requires_valid_range(__k1, __k2);
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
}
//\ Specializations\ for\ the\ common\ case\ of\ pointer\ and\ iterator:
//\ useful\ to\ avoid\ the\ overhead\ of\ temporary\ buffering\ in\ _M_replace\.
basic_string&
replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1, __k2 - __k1);
}
basic_string&
replace(iterator __i1, iterator __i2,
const _CharT* __k1, const _CharT* __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1, __k2 - __k1);
}
basic_string&
replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
}
basic_string&
replace(iterator __i1, iterator __i2,
const_iterator __k1, const_iterator __k2)
{
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend());
__glibcxx_requires_valid_range(__k1, __k2);
return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
__k1.base(), __k2 - __k1);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Replace range of characters with initializer_list.
* @param __i1 Iterator referencing start of range to replace.
* @param __i2 Iterator referencing end of range to replace.
* @param __l The initializer_list of characters to insert.
* @return Reference to this string.
* @throw std::length_error If new length exceeds @c max_size().
*
* Removes the characters in the range [__i1,__i2). In place,
* characters in the range [__k1,__k2) are inserted. If the
* length of result exceeds max_size(), length_error is thrown.
* The value of the string doesn't change if an error is
* thrown.
*/
basic_string& replace(iterator __i1, iterator __i2,
initializer_list<_CharT> __l)
{ return this->replace(__i1, __i2, __l.begin(), __l.end()); }
#endif // //\ C11 //\ C11
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Replace range of characters with string_view.
* @param __pos The position to replace at.
* @param __n The number of characters to replace.
* @param __svt The object convertible to string_view to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(size_type __pos, size_type __n, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->replace(__pos, __n, __sv.data(), __sv.size());
}
/**
* @brief Replace range of characters with string_view.
* @param __pos1 The position to replace at.
* @param __n1 The number of characters to replace.
* @param __svt The object convertible to string_view to insert from.
* @param __pos2 The position in the string_view to insert from.
* @param __n2 The number of characters to insert.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(size_type __pos1, size_type __n1, const _Tp& __svt,
size_type __pos2, size_type __n2 = npos)
{
__sv_type __sv = __svt;
return this->replace(__pos1, __n1,
__sv.data()
+ std::__sv_check(__sv.size(), __pos2, "basic_string::replace"),
std::__sv_limit(__sv.size(), __pos2, __n2));
}
/**
* @brief Replace range of characters with string_view.
* @param __i1 An iterator referencing the start position
to replace at.
* @param __i2 An iterator referencing the end position
for the replace.
* @param __svt The object convertible to string_view to insert from.
* @return Reference to this string.
*/
template<typename _Tp>
_If_sv<_Tp, basic_string&>
replace(const_iterator __i1, const_iterator __i2, const _Tp& __svt)
{
__sv_type __sv = __svt;
return this->replace(__i1 - begin(), __i2 - __i1, __sv);
}
#endif // //\ C17 //\ C17
private:
template<class _Integer>
basic_string&
_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
_Integer __val, __true_type)
{ return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
template<class _InputIterator>
basic_string&
_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
_InputIterator __k2, __false_type);
basic_string&
_M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
_CharT __c);
basic_string&
_M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
size_type __n2);
//\ _S_construct_aux\ is\ used\ to\ implement\ the\ 21\.3\.1\ para\ 15\ which
//\ requires\ special\ behaviour\ if\ _InIter\ is\ an\ integral\ type
template<class _InIterator>
static _CharT*
_S_construct_aux(_InIterator __beg, _InIterator __end,
const _Alloc& __a, __false_type)
{
typedef typename iterator_traits&#60_InIterator&#62::iterator_category _Tag;
return _S_construct(__beg, __end, __a, _Tag());
}
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 438\.\ Ambiguity\ in\ the\ "do\ the\ right\ thing"\ clause
template<class _Integer>
static _CharT*
_S_construct_aux(_Integer __beg, _Integer __end,
const _Alloc& __a, __true_type)
{ return _S_construct_aux_2(static_cast<size_type>(__beg),
__end, __a); }
static _CharT*
_S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
{ return _S_construct(__req, __c, __a); }
template<class _InIterator>
static _CharT*
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
{
typedef typename <span class="namespc">std</span>::__is_integer&#60_InIterator&#62::__type _Integral;
return _S_construct_aux(__beg, __end, __a, _Integral());
}
//\ For\ Input\ Iterators,\ used\ in\ istreambuf_iterators,\ etc\.
template<class _InIterator>
static _CharT*
_S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
input_iterator_tag);
//\ For\ forward_iterators\ up\ to\ random_access_iterators,\ used\ for
//\ string::iterator,\ _CharT\*,\ etc\.
template<class _FwdIterator>
static _CharT*
_S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
forward_iterator_tag);
static _CharT*
_S_construct(size_type __req, _CharT __c, const _Alloc& __a);
public:
/**
* @brief Copy substring into C string.
* @param __s C string to copy value into.
* @param __n Number of characters to copy.
* @param __pos Index of first character to copy.
* @return Number of characters actually copied
* @throw std::out_of_range If __pos > size().
*
* Copies up to @a __n characters starting at @a __pos into the
* C string @a __s. If @a __pos is %greater than size(),
* out_of_range is thrown.
*/
size_type
copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
/**
* @brief Swap contents with another string.
* @param __s String to swap with.
*
* Exchanges the contents of this string with that of @a __s in constant
* time.
*/
void
swap(basic_string& __s)
_GLIBCXX_NOEXCEPT_IF(allocator_traits&#60_Alloc&#62::is_always_equal::value);
//\ String\ operations:
/**
* @brief Return const pointer to null-terminated contents.
*
* This is a handle to internal data. Do not modify or dire things may
* happen.
*/
const _CharT*
c_str() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }
/**
* @brief Return const pointer to contents.
*
* This is a pointer to internal data. It is undefined to modify
* the contents through the returned pointer. To get a pointer that
* allows modifying the contents use @c &str[0] instead,
* (or in C++17 the non-const @c str.data() overload).
*/
const _CharT*
data() const _GLIBCXX_NOEXCEPT
{ return _M_data(); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Return non-const pointer to contents.
*
* This is a pointer to the character sequence held by the string.
* Modifying the characters in the sequence is allowed.
*/
_CharT*
data() noexcept
{
_M_leak();
return _M_data();
}
#endif
/**
* @brief Return copy of allocator used to construct this string.
*/
allocator_type
get_allocator() const _GLIBCXX_NOEXCEPT
{ return _M_dataplus; }
/**
* @brief Find position of a C substring.
* @param __s C string to locate.
* @param __pos Index of character to search from.
* @param __n Number of characters from @a s to search for.
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for the first @a
* __n characters in @a __s within this string. If found,
* returns the index where it begins. If not found, returns
* npos.
*/
size_type
find(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a string.
* @param __str String to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for value of @a __str within
* this string. If found, returns the index where it begins. If not
* found, returns npos.
*/
size_type
find(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a C string.
* @param __s C string to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*
* Starting from @a __pos, searches forward for the value of @a
* __s within this string. If found, returns the index where
* it begins. If not found, returns npos.
*/
size_type
find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a string_view.
* @param __svt The object convertible to string_view to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of start of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a string.
* @param __str String to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for value of @a
* __str within this string. If found, returns the index where
* it begins. If not found, returns npos.
*/
size_type
rfind(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->rfind(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a C substring.
* @param __s C string to locate.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to search for.
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for the first @a
* __n characters in @a __s within this string. If found,
* returns the index where it begins. If not found, returns
* npos.
*/
size_type
rfind(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a C string.
* @param __s C string to locate.
* @param __pos Index of character to start search at (default end).
* @return Index of start of last occurrence.
*
* Starting from @a __pos, searches backward for the value of
* @a __s within this string. If found, returns the index
* where it begins. If not found, returns npos.
*/
size_type
rfind(const _CharT* __s, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->rfind(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a string_view.
* @param __svt The object convertible to string_view to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of start of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
rfind(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->rfind(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find position of a character of string.
* @param __str String containing characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* characters of @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_first_of(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find_first_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a character of C substring.
* @param __s String containing characters to locate.
* @param __pos Index of character to search from.
* @param __n Number of characters from s to search for.
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* first @a __n characters of @a __s within this string. If
* found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a character of C string.
* @param __s String containing characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for one of the
* characters of @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_first_of(const _CharT* __s, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_first_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for the character
* @a __c within this string. If found, returns the index
* where it was found. If not found, returns npos.
*
* Note: equivalent to find(__c, __pos).
*/
size_type
find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
{ return this->find(__c, __pos); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a character of a string_view.
* @param __svt An object convertible to string_view containing
* characters to locate.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_first_of(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_first_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a character of string.
* @param __str String containing characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* characters of @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_of(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->find_last_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a character of C substring.
* @param __s C string containing characters to locate.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to search for.
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* first @a __n characters of @a __s within this string. If
* found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a character of C string.
* @param __s C string containing characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for one of the
* characters of @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_last_of(const _CharT* __s, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_last_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a character.
* @param __c Character to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for @a __c within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*
* Note: equivalent to rfind(__c, __pos).
*/
size_type
find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
{ return this->rfind(__c, __pos); }
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a character of string.
* @param __svt An object convertible to string_view containing
* characters to locate.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_last_of(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_last_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find position of a character not in string.
* @param __str String containing characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not contained
* in @a __str within this string. If found, returns the index where it
* was found. If not found, returns npos.
*/
size_type
find_first_not_of(const basic_string& __str, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{ return this->find_first_not_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find position of a character not in C substring.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search from.
* @param __n Number of characters from __s to consider.
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not
* contained in the first @a __n characters of @a __s within
* this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find_first_not_of(const _CharT* __s, size_type __pos,
size_type __n) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find position of a character not in C string.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character not
* contained in @a __s within this string. If found, returns
* the index where it was found. If not found, returns npos.
*/
size_type
find_first_not_of(const _CharT* __s, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_first_not_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find position of a different character.
* @param __c Character to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*
* Starting from @a __pos, searches forward for a character
* other than @a __c within this string. If found, returns the
* index where it was found. If not found, returns npos.
*/
size_type
find_first_not_of(_CharT __c, size_type __pos = 0) const
_GLIBCXX_NOEXCEPT;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find position of a character not in a string_view.
* @param __svt An object convertible to string_view containing
* characters to avoid.
* @param __pos Index of character to search from (default 0).
* @return Index of first occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_first_not_of(const _Tp& __svt, size_type __pos = 0) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_first_not_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Find last position of a character not in string.
* @param __str String containing characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character
* not contained in @a __str within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_not_of(const basic_string& __str, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{ return this->find_last_not_of(__str.data(), __pos, __str.size()); }
/**
* @brief Find last position of a character not in C substring.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search back from.
* @param __n Number of characters from s to consider.
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character not
* contained in the first @a __n characters of @a __s within this string.
* If found, returns the index where it was found. If not found,
* returns npos.
*/
size_type
find_last_not_of(const _CharT* __s, size_type __pos,
size_type __n) const _GLIBCXX_NOEXCEPT;
/**
* @brief Find last position of a character not in C string.
* @param __s C string containing characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character
* not contained in @a __s within this string. If found,
* returns the index where it was found. If not found, returns
* npos.
*/
size_type
find_last_not_of(const _CharT* __s, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
return this->find_last_not_of(__s, __pos, traits_type::length(__s));
}
/**
* @brief Find last position of a different character.
* @param __c Character to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*
* Starting from @a __pos, searches backward for a character other than
* @a __c within this string. If found, returns the index where it was
* found. If not found, returns npos.
*/
size_type
find_last_not_of(_CharT __c, size_type __pos = npos) const
_GLIBCXX_NOEXCEPT;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Find last position of a character not in a string_view.
* @param __svt An object convertible to string_view containing
* characters to avoid.
* @param __pos Index of character to search back from (default end).
* @return Index of last occurrence.
*/
template<typename _Tp>
_If_sv<_Tp, size_type>
find_last_not_of(const _Tp& __svt, size_type __pos = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return this->find_last_not_of(__sv.data(), __pos, __sv.size());
}
#endif // //\ C17 //\ C17
/**
* @brief Get a substring.
* @param __pos Index of first character (default 0).
* @param __n Number of characters in substring (default remainder).
* @return The new string.
* @throw std::out_of_range If __pos > size().
*
* Construct and return a new string using the @a __n
* characters starting at @a __pos. If the string is too
* short, use the remainder of the characters. If @a __pos is
* beyond the end of the string, out_of_range is thrown.
*/
basic_string
substr(size_type __pos = 0, size_type __n = npos) const
{ return basic_string(*this,
_M_check(__pos, "basic_string::substr"), __n); }
/**
* @brief Compare to a string.
* @param __str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a
* __str, 0 if their values are equivalent, or > 0 if this
* string is ordered after @a __str. Determines the effective
* length rlen of the strings to compare as the smallest of
* size() and str.size(). The function then compares the two
* strings by calling traits::compare(data(), str.data(),rlen).
* If the result of the comparison is nonzero returns it,
* otherwise the shorter one is ordered first.
*/
int
compare(const basic_string& __str) const
{
const size_type __size = this->size();
const size_type __osize = __str.size();
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
/**
* @brief Compare to a string_view.
* @param __svt An object convertible to string_view to compare against.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(const _Tp& __svt) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
const size_type __size = this->size();
const size_type __osize = __sv.size();
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __sv.data(), __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
/**
* @brief Compare to a string_view.
* @param __pos A position in the string to start comparing from.
* @param __n The number of characters to compare.
* @param __svt An object convertible to string_view to compare
* against.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(size_type __pos, size_type __n, const _Tp& __svt) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return __sv_type(*this).substr(__pos, __n).compare(__sv);
}
/**
* @brief Compare to a string_view.
* @param __pos1 A position in the string to start comparing from.
* @param __n1 The number of characters to compare.
* @param __svt An object convertible to string_view to compare
* against.
* @param __pos2 A position in the string_view to start comparing from.
* @param __n2 The number of characters to compare.
* @return Integer < 0, 0, or > 0.
*/
template<typename _Tp>
_If_sv<_Tp, int>
compare(size_type __pos1, size_type __n1, const _Tp& __svt,
size_type __pos2, size_type __n2 = npos) const
noexcept(is_same&#60_Tp, __sv_type&#62::value)
{
__sv_type __sv = __svt;
return __sv_type(*this)
.substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
}
#endif // //\ C17 //\ C17
/**
* @brief Compare substring to a string.
* @param __pos Index of first character of substring.
* @param __n Number of characters in substring.
* @param __str String to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n characters
* starting at @a __pos. Returns an integer < 0 if the
* substring is ordered before @a __str, 0 if their values are
* equivalent, or > 0 if the substring is ordered after @a
* __str. Determines the effective length rlen of the strings
* to compare as the smallest of the length of the substring
* and @a __str.size(). The function then compares the two
* strings by calling
* traits::compare(substring.data(),str.data(),rlen). If the
* result of the comparison is nonzero returns it, otherwise
* the shorter one is ordered first.
*/
int
compare(size_type __pos, size_type __n, const basic_string& __str) const;
/**
* @brief Compare substring to a substring.
* @param __pos1 Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __str String to compare against.
* @param __pos2 Index of first character of substring of str.
* @param __n2 Number of characters in substring of str.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a __pos1. Form the substring of @a
* __str from the @a __n2 characters starting at @a __pos2.
* Returns an integer < 0 if this substring is ordered before
* the substring of @a __str, 0 if their values are equivalent,
* or > 0 if this substring is ordered after the substring of
* @a __str. Determines the effective length rlen of the
* strings to compare as the smallest of the lengths of the
* substrings. The function then compares the two strings by
* calling
* traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
* If the result of the comparison is nonzero returns it,
* otherwise the shorter one is ordered first.
*/
int
compare(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2 = npos) const;
/**
* @brief Compare to a C string.
* @param __s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Returns an integer < 0 if this string is ordered before @a __s, 0 if
* their values are equivalent, or > 0 if this string is ordered after
* @a __s. Determines the effective length rlen of the strings to
* compare as the smallest of size() and the length of a string
* constructed from @a __s. The function then compares the two strings
* by calling traits::compare(data(),s,rlen). If the result of the
* comparison is nonzero returns it, otherwise the shorter one is
* ordered first.
*/
int
compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT;
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 5\ String::compare\ specification\ questionable
/**
* @brief Compare substring to a C string.
* @param __pos Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __s C string to compare against.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a pos. Returns an integer < 0 if
* the substring is ordered before @a __s, 0 if their values
* are equivalent, or > 0 if the substring is ordered after @a
* __s. Determines the effective length rlen of the strings to
* compare as the smallest of the length of the substring and
* the length of a string constructed from @a __s. The
* function then compares the two string by calling
* traits::compare(substring.data(),__s,rlen). If the result of
* the comparison is nonzero returns it, otherwise the shorter
* one is ordered first.
*/
int
compare(size_type __pos, size_type __n1, const _CharT* __s) const;
/**
* @brief Compare substring against a character %array.
* @param __pos Index of first character of substring.
* @param __n1 Number of characters in substring.
* @param __s character %array to compare against.
* @param __n2 Number of characters of s.
* @return Integer < 0, 0, or > 0.
*
* Form the substring of this string from the @a __n1
* characters starting at @a __pos. Form a string from the
* first @a __n2 characters of @a __s. Returns an integer < 0
* if this substring is ordered before the string from @a __s,
* 0 if their values are equivalent, or > 0 if this substring
* is ordered after the string from @a __s. Determines the
* effective length rlen of the strings to compare as the
* smallest of the length of the substring and @a __n2. The
* function then compares the two strings by calling
* traits::compare(substring.data(),s,rlen). If the result of
* the comparison is nonzero returns it, otherwise the shorter
* one is ordered first.
*
* NB: s must have at least n2 characters, '\\0' has
* no special meaning.
*/
int
compare(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2) const;
#if __cplusplus __cplusplus > __cplusplus > 201703L __cplusplus > 201703L __cplusplus > __cplusplus > 201703L __cplusplus > 201703L
bool
starts_with(basic_string_view<_CharT, _Traits> __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
starts_with(_CharT __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
starts_with(const _CharT* __x) const noexcept
{ return __sv_type(this->data(), this->size()).starts_with(__x); }
bool
ends_with(basic_string_view<_CharT, _Traits> __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
bool
ends_with(_CharT __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
bool
ends_with(const _CharT* __x) const noexcept
{ return __sv_type(this->data(), this->size()).ends_with(__x); }
#endif // //\ C20 //\ C20
# ifdef ifdef _GLIBCXX_TM_TS_INTERNAL ifdef _GLIBCXX_TM_TS_INTERNAL
friend void
::_txnal_cow_string_C1_for_exceptions(void* that, const char* s,
void* exc);
friend const char*
::_txnal_cow_string_c_str(const void *that);
friend void
::_txnal_cow_string_D1(void *that);
friend void
::_txnal_cow_string_D1_commit(void *that);
# endif
};
#endif // //\ !_GLIBCXX_USE_CXX11_ABI //\ !_GLIBCXX_USE_CXX11_ABI
#if __cpp_deduction_guides __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606
_GLIBCXX_BEGIN_NAMESPACE_CXX11
template<typename _InputIterator, typename _CharT
= typename iterator_traits&#60_InputIterator&#62::value_type,
typename _Allocator = allocator<_CharT>,
typename = _RequireInputIter<_InputIterator>,
typename = _RequireAllocator<_Allocator>>
basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
-> basic_string<_CharT, char_traits<_CharT>, _Allocator>
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3075\.\ basic_string\ needs\ deduction\ guides\ from\ basic_string_view
template<typename _CharT, typename _Traits,
typename _Allocator = allocator<_CharT>,
typename = _RequireAllocator<_Allocator>>
basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
-> basic_string<_CharT, _Traits, _Allocator>
template<typename _CharT, typename _Traits,
typename _Allocator = allocator<_CharT>,
typename = _RequireAllocator<_Allocator>>
basic_string(basic_string_view<_CharT, _Traits>,
typename basic_string&#60_CharT, _Traits, _Allocator&#62::size_type,
typename basic_string&#60_CharT, _Traits, _Allocator&#62::size_type,
const _Allocator& = _Allocator())
-> basic_string<_CharT, _Traits, _Allocator>
_GLIBCXX_END_NAMESPACE_CXX11
#endif
//\ operator
/**
* @brief Concatenate two strings.
* @param __lhs First string.
* @param __rhs Last string.
* @return New string with value of @a __lhs followed by @a __rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{
basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
__str.append(__rhs);
return __str;
}
/**
* @brief Concatenate C string and string.
* @param __lhs First string.
* @param __rhs Last string.
* @return New string with value of @a __lhs followed by @a __rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc>
operator+(const _CharT* __lhs,
const basic_string<_CharT,_Traits,_Alloc>& __rhs);
/**
* @brief Concatenate character and string.
* @param __lhs First string.
* @param __rhs Last string.
* @return New string with @a __lhs followed by @a __rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT,_Traits,_Alloc>
operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
/**
* @brief Concatenate string and C string.
* @param __lhs First string.
* @param __rhs Last string.
* @return New string with @a __lhs followed by @a __rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{
basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
__str.append(__rhs);
return __str;
}
/**
* @brief Concatenate string and character.
* @param __lhs First string.
* @param __rhs Last string.
* @return New string with @a __lhs followed by @a __rhs.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
{
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __string_type::size_type __size_type;
__string_type __str(__lhs);
__str.append(__size_type(1), __rhs);
return __str;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return std::move(__lhs.append(__rhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{
const auto __size = __lhs.size() + __rhs.size();
const bool __cond = (__size > __lhs.capacity()
&& __size <= __rhs.capacity());
return __cond ? std::move(__rhs.insert(0, __lhs))
: std::move(__lhs.append(__rhs));
}
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const _CharT* __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(_CharT __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, 1, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
401a1c55 push %rbp operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
const _CharT* __rhs)
401a3048 8b 55 e8 mov -0x18(%rbp),%rdx { return std::move(__lhs.append(__rhs)); }
const _CharT* __rhs)
401a4e48 8b 45 f8 mov -0x8(%rbp),%rax
const _CharT* __rhs)
401a5d48 8b 45 f8 mov -0x8(%rbp),%rax
_ZSt4moveIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEONSt16remove_referenceIT_E4typeEOS8_
/usr/include/c++/9/bits/move.h
//\ Move,\ forward\ and\ identity\ for\ C11\ \ swap\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2007\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/move.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{utility}
*/
#ifndef _MOVE_H
#define _MOVE_H _MOVE_H 1 _MOVE_H 1
#include <bits/c++config.h>
#include <bits/concept_check.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ Used,\ in\ C03\ mode\ too,\ by\ allocators,\ etc\.
/**
* @brief Same as C++11 std::addressof
* @ingroup utilities
*/
template<typename _Tp>
inline _GLIBCXX_CONSTEXPR _Tp*
__addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
{ return __builtin_addressof(__r); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. clude <type_traits> <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup utilities
* @{
*/
/**
* @brief Forward an lvalue.
* @return The parameter cast to the specified type.
*
* This function is used to implement "perfect forwarding".
*/
template<typename _Tp>
constexpr _Tp&&
forward(typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }
/**
* @brief Forward an rvalue.
* @return The parameter cast to the specified type.
*
* This function is used to implement "perfect forwarding".
*/
template<typename _Tp>
constexpr _Tp&&
forward(typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&& __t) noexcept
{
static_assert(!<span class="namespc">std</span>::is_lvalue_reference&#60_Tp&#62::value, <span class="str">"template argument"</span>
" substituting _Tp is an lvalue reference type");
return static_cast<_Tp&&>(__t);
}
/**
* @brief Convert a value to an rvalue.
* @param __t A thing of arbitrary type.
* @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
constexpr typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&&
401a6355 push %rbp move(_Tp&& __t) noexcept
401a6b48 8b 45 f8 mov -0x8(%rbp),%rax { return static_cast&#60typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&&&#62(__t); }
401a6f5d pop %rbp
401a7190 nop
_ZNSaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1Ev
/usr/include/c++/9/bits/allocator.h
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
401a7255 push %rbp allocator() _GLIBCXX_NOTHROW { }
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
401a7e48 8b 45 f8 mov -0x8(%rbp),%rax
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
401a8a90 nop
//\ Allocators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
* Copyright (c) 1996-1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/allocator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOCATOR_H
#define _ALLOCATOR_H _ALLOCATOR_H 1 _ALLOCATOR_H 1
<bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro">#include <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. ="macro_pred"><bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.h> // Define the base class <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r. <bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. std::alloca<bits/c++allocator.h> // Define the base class to <bits/c++allocator.h> //\ Define\ the\ base\ class\ to\ std::allocator\. r.
#include <bits/memoryfwd.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
#define __cpp_lib_incomplete_container_elements __cpp_lib_incomplete_container_elements 201505 __cpp_lib_incomplete_container_elements 201505
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# define define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal define __cpp_lib_allocator_is_always_equal 201411 define __cpp_lib_allocator_is_always_equal 201411
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup allocators
* @{
*/
///\ allocator&\#60void&\#62\ specialization\.
template<>
class allocator<void>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
{ ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
template<typename _Up>
void
destroy(_Up* __p)
noexcept(noexcept(__p->~_Up()))
{ __p->~_Up(); }
#endif
};
/**
* @brief The @a standard allocator, as per [20.4].
*
* See https://gcc\.gnu\.org/onlinedocs/libstdc/manual/memory\.html\#std\.util\.memory\.allocator
* for further details.
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class allocator : public __allocator_base<_Tp>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ std::allocator\ propagate_on_container_move_assignment
typedef true_type propagate_on_container_move_assignment;
typedef true_type is_always_equal;
#endif
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 3035\.\ std::allocator's\ constructors\ should\ be\ constexpr
_GLIBCXX20_CONSTEXPR
401a8d90 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_Vector_impl_dataC1Ev
/usr/include/c++/9/bits/stl_vector.h
//\ Vector\ implementation\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_vector.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{vector}
*/
#ifndef _STL_VECTOR_H
#define _STL_VECTOR_H _STL_VECTOR_H 1 _STL_VECTOR_H 1
#include <bits/stl_iterator_base_funcs.h>
#include <bits/functexcept.h>
#include <bits/concept_check.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <initializer_list>
#endif
#include <debug/assertions.h>
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
extern "C" void
__sanitizer_annotate_contiguous_container(const void*, const void*,
const void*, const void*);
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
///\ See\ bits/stl_deque\.h's\ _Deque_base\ for\ an\ explanation\.
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Alloc&#62::template
rebind&#60_Tp&#62::other _Tp_alloc_type;
typedef typename __gnu_<span class="namespc">cxx</span>::__alloc_traits&#60_Tp_alloc_type&#62::pointer
pointer;
struct _Vector_impl_data
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
401a8e55 push %rbp _Vector_impl_data() _GLIBCXX_NOEXCEPT
401a9648 8b 45 f8 mov -0x8(%rbp),%rax : _M_start(), _M_finish(), _M_end_of_storage()
401ab990 nop { }
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEED1Ev
/usr/include/c++/9/ext/new_allocator.h
//\ Allocator\ that\ wraps\ operator\ new\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file ext/new_allocator.h
* This file is a GNU extension to the Standard C++ Library.
*/
#ifndef _NEW_ALLOCATOR_H
#define _NEW_ALLOCATOR_H _NEW_ALLOCATOR_H 1 _NEW_ALLOCATOR_H 1
#include <bits/c++config.h>
#include <new>
#include <bits/functexcept.h>
#include <bits/move.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using std::size_t;
using std::ptrdiff_t;
/**
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ propagate_on_container_move_assignment
typedef std::true_type propagate_on_container_move_assignment;
#endif
_GLIBCXX20_CONSTEXPR
new_allocator() _GLIBCXX_USE_NOEXCEPT { }
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
401abc55 push %rbp ~new_allocator() _GLIBCXX_USE_NOEXCEPT { }
//\ Allocator\ that\ wraps\ operator\ new\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file ext/new_allocator.h
* This file is a GNU extension to the Standard C++ Library.
*/
#ifndef _NEW_ALLOCATOR_H
#define _NEW_ALLOCATOR_H _NEW_ALLOCATOR_H 1 _NEW_ALLOCATOR_H 1
#include <bits/c++config.h>
#include <new>
#include <bits/functexcept.h>
#include <bits/move.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using std::size_t;
using std::ptrdiff_t;
/**
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ propagate_on_container_move_assignment
typedef std::true_type propagate_on_container_move_assignment;
#endif
_GLIBCXX20_CONSTEXPR
new_allocator() _GLIBCXX_USE_NOEXCEPT { }
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
401ac490 nop
//\ Allocator\ that\ wraps\ operator\ new\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file ext/new_allocator.h
* This file is a GNU extension to the Standard C++ Library.
*/
#ifndef _NEW_ALLOCATOR_H
#define _NEW_ALLOCATOR_H _NEW_ALLOCATOR_H 1 _NEW_ALLOCATOR_H 1
#include <bits/c++config.h>
#include <new>
#include <bits/functexcept.h>
#include <bits/move.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using std::size_t;
using std::ptrdiff_t;
/**
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ propagate_on_container_move_assignment
typedef std::true_type propagate_on_container_move_assignment;
#endif
_GLIBCXX20_CONSTEXPR
new_allocator() _GLIBCXX_USE_NOEXCEPT { }
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
template<typename _Tp1>
_GLIBCXX20_CONSTEXPR
new_allocator(const new_allocator<_Tp1>&) _GLIBCXX_USE_NOEXCEPT { }
401ac790 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE13_M_deallocateEPS5_m
/usr/include/c++/9/bits/stl_vector.h
public:
_Vector_impl _M_impl;
pointer
_M_allocate(size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
}
void
401ac855 push %rbp _M_deallocate(pointer __p, size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
401adc48 83 7d f0 00 cmpq $0x0,-0x10(%rbp) if (__p)
401ae348 8b 45 f8 mov -0x8(%rbp),%rax _Tr::deallocate(_M_impl, __p, __n);
401ae748 8b 55 e8 mov -0x18(%rbp),%rdx
401afa90 nop }
401afd90 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE19_M_get_Tp_allocatorEv
_Vector_impl(_Tp_alloc_type&& __a) noexcept
: _Tp_alloc_type(std::move(__a))
{ }
_Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
: _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
{ }
#endif
#if _GLIBCXX_SANITIZE_STD_ALLOCATOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
template<typename = _Tp_alloc_type>
struct _Asan
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
static void _S_shrink(_Vector_impl&, size_type) { }
static void _S_on_dealloc(_Vector_impl&) { }
typedef _Vector_impl& _Reinit;
struct _Grow
{
_Grow(_Vector_impl&, size_type) { }
void _M_grew(size_type) { }
};
};
//\ Enable\ ASan\ annotations\ for\ memory\ obtained\ from\ std::allocator\.
template<typename _Up>
struct _Asan<allocator<_Up> >
{
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
::size_type size_type;
//\ Adjust\ ASan\ annotation\ for\ \[_M_start,\ _M_end_of_storage\)\ to
//\ mark\ end\ of\ valid\ region\ as\ __curr\ instead\ of\ __prev\.
static void
_S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
{
__sanitizer_annotate_contiguous_container(__impl._M_start,
__impl._M_end_of_storage, __prev, __curr);
}
static void
_S_grow(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
static void
_S_shrink(_Vector_impl& __impl, size_type __n)
{ _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
static void
_S_on_dealloc(_Vector_impl& __impl)
{
if (__impl._M_start)
_S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
}
//\ Used\ on\ reallocation\ to\ tell\ ASan\ unused\ capacity\ is\ invalid\.
struct _Reinit
{
explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
{
//\ Mark\ unused\ capacity\ as\ valid\ again\ before\ deallocating\ it\.
_S_on_dealloc(_M_impl);
}
~_Reinit()
{
//\ Mark\ unused\ capacity\ as\ invalid\ after\ reallocation\.
if (_M_impl._M_start)
_S_adjust(_M_impl, _M_impl._M_end_of_storage,
_M_impl._M_finish);
}
_Vector_impl& _M_impl;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Reinit(const _Reinit&) = delete;
_Reinit& operator=(const _Reinit&) = delete;
#endif
};
//\ Tell\ ASan\ when\ unused\ capacity\ is\ initialized\ to\ be\ valid\.
struct _Grow
{
_Grow(_Vector_impl& __impl, size_type __n)
: _M_impl(__impl), _M_n(__n)
{ _S_grow(_M_impl, __n); }
~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
void _M_grew(size_type __n) { _M_n -= __n; }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_Grow(const _Grow&) = delete;
_Grow& operator=(const _Grow&) = delete;
#endif
private:
_Vector_impl& _M_impl;
size_type _M_n;
};
};
#define _GLIBCXX_ASAN_ANNOTATE_REINIT _GLIBCXX_ASAN_ANNOTATE_REINIT \ _GLIBCXX_ASAN_ANNOTATE_REINIT \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Reinit const \
__attribute__((__unused__)) __reinit_guard(this->_M_impl)
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n) _GLIBCXX_ASAN_ANNOTATE_GROW(n) \ _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
typename _<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_Grow \
__attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n) _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \ _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_shrink(this-&#62_M_<span class="namespc">impl</span>, n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \ _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
_<span class="namespc">Base</span>::_Vector_<span class="namespc">impl</span>::template _Asan&#60&#62::_S_on_dealloc(this-&#62_M_<span class="namespc">impl</span>)
#else // // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\) //\ !\ \(_GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR\)
#define _GLIBCXX_ASAN_ANNOTATE_REINIT
#define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
#define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
#endif // // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR // _GLIBCXX_SANITIZE_STD_ALLOCATOR && //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR //\ _GLIBCXX_SANITIZE_STD_ALLOCATOR\ &&\ _GLIBCXX_SANITIZE_VECTOR
};
public:
typedef _Alloc allocator_type;
_Tp_alloc_type&
401afe55 push %rbp _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
401b0648 8b 45 f8 mov -0x8(%rbp),%rax { return this->_M_impl; }
401b0a5d pop %rbp
_ZSt8_DestroyIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EvT_S7_RSaIT0_E
/usr/include/c++/9/bits/stl_construct.h
//\ nonstandard\ construct\ and\ destroy\ functions\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_construct.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_CONSTRUCT_H
#define _STL_CONSTRUCT_H _STL_CONSTRUCT_H 1 _STL_CONSTRUCT_H 1
#include <new>
#include <bits/move.h>
#include <ext/alloc_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _T1, typename... _Args>
inline void
_Construct(_T1* __p, _Args&&... __args)
{ ::new(static_cast&#60void*&#62(__p)) _T1(std::forward&#60_Args&#62(__args)...); }
#else
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 402\.\ wrong\ new\ expression\ in\ \[some_\]allocator::construct
::new(static_cast&#60void*&#62(__p)) _T1(__value);
}
#endif
template<typename _T1>
inline void
_Construct_novalue(_T1* __p)
{ ::new(static_cast&#60void*&#62(__p)) _T1; }
/**
* Destroy the object pointed to by a pointer type.
*/
template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
template<bool>
struct _Destroy_aux
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator __first, _ForwardIterator __last)
{
for (; __first != __last; ++__first)
std::_Destroy(std::__addressof(*__first));
}
};
template<>
struct _Destroy_aux<true>
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator, _ForwardIterator) { }
};
/**
* Destroy a range of objects. If the value_type of the object has
* a trivial destructor, the compiler should optimize all of this
* away, otherwise the objects' destructors must be invoked.
*/
template<typename _ForwardIterator>
inline void
_Destroy(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_Value_type;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ A\ deleted\ destructor\ is\ trivial,\ this\ ensures\ we\ reject\ such\ types:
static_assert(is_destructible&#60_Value_type&#62::value,
"value type is destructible");
#endif
<span class="namespc">std</span>::_Destroy_aux&#60__has_trivial_destructor(_Value_type)&#62::
__destroy(__first, __last);
}
template<bool>
struct _Destroy_n_aux
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__destroy_n(_ForwardIterator __first, _Size __count)
{
for (; __count > 0; (void)++__first, --__count)
std::_Destroy(std::__addressof(*__first));
return __first;
}
};
template<>
struct _Destroy_n_aux<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__destroy_n(_ForwardIterator __first, _Size __count)
{
std::advance(__first, __count);
return __first;
}
};
/**
* Destroy a range of objects. If the value_type of the object has
* a trivial destructor, the compiler should optimize all of this
* away, otherwise the objects' destructors must be invoked.
*/
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
_Destroy_n(_ForwardIterator __first, _Size __count)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_Value_type;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ A\ deleted\ destructor\ is\ trivial,\ this\ ensures\ we\ reject\ such\ types:
static_assert(is_destructible&#60_Value_type&#62::value,
"value type is destructible");
#endif
return <span class="namespc">std</span>::_Destroy_n_aux&#60__has_trivial_destructor(_Value_type)&#62::
__destroy_n(__first, __count);
}
/**
* Destroy a range of objects using the supplied allocator. For
* nondefault allocators we do not optimize away invocation of
* destroy() even if _Tp has a trivial destructor.
*/
template<typename _ForwardIterator, typename _Allocator>
void
_Destroy(_ForwardIterator __first, _ForwardIterator __last,
_Allocator& __alloc)
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __first != __last; ++__first)
__traits::destroy(__alloc, std::__addressof(*__first));
}
template<typename _ForwardIterator, typename _Tp>
inline void
401b0c55 push %rbp _Destroy(_ForwardIterator __first, _ForwardIterator __last,
allocator<_Tp>&)
{
401b2048 8b 55 f0 mov -0x10(%rbp),%rdx _Destroy(__first, __last);
401b3390 nop }
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12emplace_backIJS5_EEEvDpOT_
/usr/include/c++/9/bits/vector.tcc
//\ Vector\ implementation\ \(out\ of\ line\)\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/vector.tcc
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{vector}
*/
#ifndef _VECTOR_TCC
#define _VECTOR_TCC _VECTOR_TCC 1 _VECTOR_TCC 1
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc>
void
vector&#60_Tp, _Alloc&#62::
reserve(size_type __n)
{
if (__n > this->max_size())
__throw_length_error(__N("vector::reserve"));
if (this->capacity() < __n)
{
const size_type __old_size = size();
pointer __tmp;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
{
__tmp = this->_M_allocate(__n);
_S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
__tmp, _M_get_Tp_allocator());
}
else
#endif
{
__tmp = _M_allocate_and_copy(__n,
_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_start),
_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_finish));
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
}
_GLIBCXX_ASAN_ANNOTATE_REINIT;
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __tmp;
this->_M_impl._M_finish = __tmp + __old_size;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
template<typename... _Args>
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
typename vector&#60_Tp, _Alloc&#62::reference
#else
void
#endif
401b3655 push %rbp vector&#60_Tp, _Alloc&#62::
emplace_back(_Args&&... __args)
{
401b4748 8b 45 e8 mov -0x18(%rbp),%rax if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
emplace_back(_Args&&... __args)
{
401b4f48 8b 45 e8 mov -0x18(%rbp),%rax
emplace_back(_Args&&... __args)
{
401b5748 39 c2 cmp %rax,%rdx
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
401b5c48 8b 45 e0 mov -0x20(%rbp),%rax _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
401b7348 8b 45 e8 mov -0x18(%rbp),%rax
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
401b7748 89 ce mov %rcx,%rsi
std::forward<_Args>(__args)...);
401b8248 8b 45 e8 mov -0x18(%rbp),%rax ++this->_M_impl._M_finish;
std::forward<_Args>(__args)...);
401b8a48 8d 50 20 lea (%rax),%rdx
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
_M_realloc_insert(end(), std::forward<_Args>(__args)...);
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
return back();
#endif
401b96eb 30 jmp401bc8_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12emplace_backIJS5_EEEvDpOT_+0x92 }
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
401b9848 8b 45 e0 mov -0x20(%rbp),%rax _M_realloc_insert(end(), std::forward<_Args>(__args)...);
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
return back();
#endif
401bc890 nop }
_ZSt4moveIRNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE12_Vector_implEEONSt16remove_referenceIT_E4typeEOSC_
/usr/include/c++/9/bits/move.h
//\ Move,\ forward\ and\ identity\ for\ C11\ \ swap\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2007\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/move.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{utility}
*/
#ifndef _MOVE_H
#define _MOVE_H _MOVE_H 1 _MOVE_H 1
#include <bits/c++config.h>
#include <bits/concept_check.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ Used,\ in\ C03\ mode\ too,\ by\ allocators,\ etc\.
/**
* @brief Same as C++11 std::addressof
* @ingroup utilities
*/
template<typename _Tp>
inline _GLIBCXX_CONSTEXPR _Tp*
__addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
{ return __builtin_addressof(__r); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. clude <type_traits> <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup utilities
* @{
*/
/**
* @brief Forward an lvalue.
* @return The parameter cast to the specified type.
*
* This function is used to implement "perfect forwarding".
*/
template<typename _Tp>
constexpr _Tp&&
forward(typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }
/**
* @brief Forward an rvalue.
* @return The parameter cast to the specified type.
*
* This function is used to implement "perfect forwarding".
*/
template<typename _Tp>
constexpr _Tp&&
forward(typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&& __t) noexcept
{
static_assert(!<span class="namespc">std</span>::is_lvalue_reference&#60_Tp&#62::value, <span class="str">"template argument"</span>
" substituting _Tp is an lvalue reference type");
return static_cast<_Tp&&>(__t);
}
/**
* @brief Convert a value to an rvalue.
* @param __t A thing of arbitrary type.
* @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
constexpr typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&&
401bd055 push %rbp move(_Tp&& __t) noexcept
401bd848 8b 45 f8 mov -0x8(%rbp),%rax { return static_cast&#60typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type&&&#62(__t); }
401bdc5d pop %rbp
_ZNSaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS5_
/usr/include/c++/9/bits/allocator.h
_GLIBCXX20_CONSTEXPR
401bde55 push %rbp allocator(const allocator& __a) _GLIBCXX_NOTHROW
401bee48 8b 55 f0 mov -0x10(%rbp),%rdx : __allocator_base<_Tp>(__a) { }
401c0190 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_Vector_impl_dataC1EOS8_
/usr/include/c++/9/bits/stl_vector.h
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401c0455 push %rbp _Vector_impl_data(_Vector_impl_data&& __x) noexcept
401c1048 8b 45 f0 mov -0x10(%rbp),%rax : _M_start(__x._M_start), _M_finish(__x._M_finish),
401c1748 8b 45 f8 mov -0x8(%rbp),%rax _M_end_of_storage(__x._M_end_of_storage)
401c1e48 8b 45 f0 mov -0x10(%rbp),%rax : _M_start(__x._M_start), _M_finish(__x._M_finish),
401c2648 8b 45 f8 mov -0x8(%rbp),%rax _M_end_of_storage(__x._M_end_of_storage)
401c2e48 8b 45 f0 mov -0x10(%rbp),%rax
401c3648 8b 45 f8 mov -0x8(%rbp),%rax
401c3e48 8b 45 f0 mov -0x10(%rbp),%rax { __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
401c4a48 8b 45 f0 mov -0x10(%rbp),%rax
401c5248 8b 45 f0 mov -0x10(%rbp),%rax
401c5a48 8b 45 f0 mov -0x10(%rbp),%rax
401c6248 8b 45 f0 mov -0x10(%rbp),%rax
401c6990 nop
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1Ev
/usr/include/c++/9/ext/new_allocator.h
//\ Allocator\ that\ wraps\ operator\ new\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file ext/new_allocator.h
* This file is a GNU extension to the Standard C++ Library.
*/
#ifndef _NEW_ALLOCATOR_H
#define _NEW_ALLOCATOR_H _NEW_ALLOCATOR_H 1 _NEW_ALLOCATOR_H 1
#include <bits/c++config.h>
#include <new>
#include <bits/functexcept.h>
#include <bits/move.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using std::size_t;
using std::ptrdiff_t;
/**
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ propagate_on_container_move_assignment
typedef std::true_type propagate_on_container_move_assignment;
#endif
_GLIBCXX20_CONSTEXPR
401c6c55 push %rbp new_allocator() _GLIBCXX_USE_NOEXCEPT { }
//\ Allocator\ that\ wraps\ operator\ new\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file ext/new_allocator.h
* This file is a GNU extension to the Standard C++ Library.
*/
#ifndef _NEW_ALLOCATOR_H
#define _NEW_ALLOCATOR_H _NEW_ALLOCATOR_H 1 _NEW_ALLOCATOR_H 1
#include <bits/c++config.h>
#include <new>
#include <bits/functexcept.h>
#include <bits/move.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using std::size_t;
using std::ptrdiff_t;
/**
* @brief An allocator that uses global new, as per [20.4].
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls operator new
* - all deallocation calls operator delete
*
* @tparam _Tp Type of allocated object.
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2103\.\ propagate_on_container_move_assignment
typedef std::true_type propagate_on_container_move_assignment;
#endif
_GLIBCXX20_CONSTEXPR
401c7490 nop
_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE10deallocateERS6_PS5_m
/usr/include/c++/9/bits/alloc_traits.h
//\ Allocator\ traits\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2011\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/alloc_traits.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOC_TRAITS_H
#define _ALLOC_TRAITS_H _ALLOC_TRAITS_H 1 _ALLOC_TRAITS_H 1
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <bits/memoryfwd.h>
#include <bits/ptr_traits.h>
#include <ext/numeric_traits.h>
#define __cpp_lib_allocator_traits_is_always_equal __cpp_lib_allocator_traits_is_always_equal 201411 __cpp_lib_allocator_traits_is_always_equal 201411
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __allocator_traits_base
{
template<typename _Tp, typename _Up, typename = void>
struct __rebind : __replace_first_arg<_Tp, _Up> { };
template<typename _Tp, typename _Up>
struct __rebind<_Tp, _Up,
__void_t&#60typename _<span class="namespc">Tp</span>::template rebind&#60_Up&#62::other&#62&#62
{ using type = typename _<span class="namespc">Tp</span>::template rebind&#60_Up&#62::other; };
protected:
template<typename _Tp>
using __pointer = typename _Tp::pointer;
template<typename _Tp>
using __c_pointer = typename _Tp::const_pointer;
template<typename _Tp>
using __v_pointer = typename _Tp::void_pointer;
template<typename _Tp>
using __cv_pointer = typename _Tp::const_void_pointer;
template<typename _Tp>
using __pocca = typename _Tp::propagate_on_container_copy_assignment;
template<typename _Tp>
using __pocma = typename _Tp::propagate_on_container_move_assignment;
template<typename _Tp>
using __pocs = typename _Tp::propagate_on_container_swap;
template<typename _Tp>
using __equal = typename _Tp::is_always_equal;
};
template<typename _Alloc, typename _Up>
using __alloc_rebind
= typename __allocator_traits_<span class="namespc">base</span>::template __rebind&#60_Alloc, _Up&#62::type;
/**
* @brief Uniform interface to all allocator types.
* @ingroup allocators
*/
template<typename _Alloc>
struct allocator_traits : __allocator_traits_base
{
///\ The\ allocator\ type
typedef _Alloc allocator_type;
///\ The\ allocated\ type
typedef typename _Alloc::value_type value_type;
/**
* @brief The allocator's pointer type.
*
* @c Alloc::pointer if that type exists, otherwise @c value_type*
*/
using pointer = __detected_or_t<value_type*, __pointer, _Alloc>
private:
<span class="comment">//\ Select\ _Func&\#60_Alloc&\#62\ or\ pointer_traits&\#60pointer&\#62::rebind&\#60_Tp&\#62</span>
template<template<typename> class _Func, typename _Tp, typename = void>
struct _Ptr
{
using type = typename pointer_traits&#60pointer&#62::template rebind&#60_Tp&#62;
};
template<template<typename> class _Func, typename _Tp>
struct _Ptr<_Func, _Tp, __void_t<_Func<_Alloc>>>
{
using type = _Func<_Alloc>
};
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>m<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>/<span class="namespc"></span>/<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>S<span class="namespc"></span>e<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>d<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>p<span class="namespc"></span>o<span class="namespc"></span>i<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>i<span class="namespc"></span>t<span class="namespc"></span>s<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>P<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>d<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span> <span class="namespc"></span>
template<typename _A2, typename _PtrT, typename = void>
struct _Diff
{ using type = typename pointer_traits&#60_PtrT&#62::difference_type; };
template<typename _A2, typename _PtrT>
struct _Diff&#60_A2, _PtrT, __void_t&#60typename _A2::difference_type&#62&#62
{ using type = typename _A2::difference_type; };
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>m<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>/<span class="namespc"></span>/<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>S<span class="namespc"></span>e<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>s<span class="namespc"></span>i<span class="namespc"></span>z<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>m<span class="namespc"></span>a<span class="namespc"></span>k<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>u<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>i<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>e<span class="namespc"></span>d<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>D<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>T<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span> <span class="namespc"></span>
template<typename _A2, typename _DiffT, typename = void>
struct _Size : make_unsigned<_DiffT> { };
template<typename _A2, typename _DiffT>
struct _Size&#60_A2, _DiffT, __void_t&#60typename _A2::size_type&#62&#62
{ using type = typename _A2::size_type; };
public:
/**
* @brief The allocator's const pointer type.
*
* @c Alloc::const_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60const value_type&#62 &#60/tt&#62
*/
using const_pointer = typename _Ptr&#60__c_pointer, const value_type&#62::type;
/**
* @brief The allocator's void pointer type.
*
* @c Alloc::void_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60void&#62 &#60/tt&#62
*/
using void_pointer = typename _Ptr&#60__v_pointer, void&#62::type;
/**
* @brief The allocator's const void pointer type.
*
* @c Alloc::const_void_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60const void&#62 &#60/tt&#62
*/
using const_void_pointer = typename _Ptr&#60__cv_pointer, const void&#62::type;
/**
* @brief The allocator's difference type
*
* @c Alloc::difference_type if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::difference_type &#60/tt&#62
*/
using difference_type = typename _Diff&#60_Alloc, pointer&#62::type;
/**
* @brief The allocator's size type
*
* @c Alloc::size_type if that type exists, otherwise
* &#60tt&#62 make_unsigned&#60difference_type&#62::type &#60/tt&#62
*/
using size_type = typename _Size&#60_Alloc, difference_type&#62::type;
/**
* @brief How the allocator is propagated on copy assignment
*
* @c Alloc::propagate_on_container_copy_assignment if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_copy_assignment
= __detected_or_t<false_type, __pocca, _Alloc>
/**
* @brief How the allocator is propagated on move assignment
*
* @c Alloc::propagate_on_container_move_assignment if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_move_assignment
= __detected_or_t<false_type, __pocma, _Alloc>
/**
* @brief How the allocator is propagated on swap
*
* @c Alloc::propagate_on_container_swap if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_swap
= __detected_or_t<false_type, __pocs, _Alloc>
/**
* @brief Whether all instances of the allocator type compare equal.
*
* @c Alloc::is_always_equal if that type exists,
* otherwise @c is_empty&#60Alloc&#62::type
*/
using is_always_equal
= __detected_or_t&#60typename is_empty&#60_Alloc&#62::type, __equal, _Alloc&#62;
template<typename _Tp>
using rebind_alloc = __alloc_rebind<_Alloc, _Tp>
template<typename _Tp>
using rebind_traits = allocator_traits<rebind_alloc<_Tp>>
private:
template<typename _Alloc2>
static auto
_S_allocate(_Alloc2& __a, size_type __n, const_void_pointer __hint, int)
-> decltype(__a.allocate(__n, __hint))
{ return __a.allocate(__n, __hint); }
template<typename _Alloc2>
static pointer
_S_allocate(_Alloc2& __a, size_type __n, const_void_pointer, ...)
{ return __a.allocate(__n); }
template<typename _Tp, typename... _Args>
struct __construct_helper
{
template<typename _Alloc2,
typename = decltype(std::declval<_Alloc2*>()->construct(
std::declval<_Tp*>(), std::declval<_Args>()...))>
static true_type __test(int);
template<typename>
static false_type __test(...);
using type = decltype(__test<_Alloc>(0));
};
template<typename _Tp, typename... _Args>
using __has_construct
= typename __construct_helper&#60_Tp, _Args...&#62::type;
template<typename _Tp, typename... _Args>
static _Require<__has_construct<_Tp, _Args...>>
_S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
{ __a.construct(__p, std::forward<_Args>(__args)...); }
template<typename _Tp, typename... _Args>
static
_Require<__and_<__not_<__has_construct<_Tp, _Args...>>,
is_constructible<_Tp, _Args...>>>
_S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
noexcept(noexcept(::new((void*)__p)
_Tp(std::forward<_Args>(__args)...)))
{ ::new((void*)__p) _Tp(std::forward&#60_Args&#62(__args)...); }
template<typename _Alloc2, typename _Tp>
static auto
_S_destroy(_Alloc2& __a, _Tp* __p, int)
noexcept(noexcept(__a.destroy(__p)))
-> decltype(__a.destroy(__p))
{ __a.destroy(__p); }
template<typename _Alloc2, typename _Tp>
static void
_S_destroy(_Alloc2&, _Tp* __p, ...)
noexcept(noexcept(__p->~_Tp()))
{ __p->~_Tp(); }
template<typename _Alloc2>
static auto
_S_max_size(_Alloc2& __a, int)
-> decltype(__a.max_size())
{ return __a.max_size(); }
template<typename _Alloc2>
static size_type
_S_max_size(_Alloc2&, ...)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2466\.\ allocator_traits::max_size\(\)\ default\ behavior\ is\ incorrect
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60size_type&#62::__max
/ sizeof(value_type);
}
template<typename _Alloc2>
static auto
_S_select(_Alloc2& __a, int)
-> decltype(__a.select_on_container_copy_construction())
{ return __a.select_on_container_copy_construction(); }
template<typename _Alloc2>
static _Alloc2
_S_select(_Alloc2& __a, ...)
{ return __a; }
public:
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
*
* Calls @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
allocate(_Alloc& __a, size_type __n)
{ return __a.allocate(__n); }
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
* @param __hint Aid to locality.
* @return Memory of suitable size and alignment for @a n objects
* of type @c value_type
*
* Returns <tt> a.allocate(n, hint) </tt> if that expression is
* well-formed, otherwise returns @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
allocate(_Alloc& __a, size_type __n, const_void_pointer __hint)
{ return _S_allocate(__a, __n, __hint, 0); }
/**
* @brief Deallocate memory.
* @param __a An allocator.
* @param __p Pointer to the memory to deallocate.
* @param __n The number of objects space was allocated for.
*
* Calls <tt> a.deallocate(p, n) </tt>
*/
static void
deallocate(_Alloc& __a, pointer __p, size_type __n)
{ __a.deallocate(__p, __n); }
/**
* @brief Construct an object of type @a _Tp
* @param __a An allocator.
* @param __p Pointer to memory of suitable size and alignment for Tp
* @param __args Constructor arguments.
*
* Calls <tt> __a.construct(__p, std::forward<Args>(__args)...) </tt>
* if that expression is well-formed, otherwise uses placement-new
* to construct an object of type @a _Tp at location @a __p from the
* arguments @a __args...
*/
template<typename _Tp, typename... _Args>
static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
noexcept(noexcept(_S_construct(__a, __p,
std::forward<_Args>(__args)...)))
-> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
{ _S_construct(__a, __p, std::forward<_Args>(__args)...); }
/**
* @brief Destroy an object of type @a _Tp
* @param __a An allocator.
* @param __p Pointer to the object to destroy
*
* Calls @c __a.destroy(__p) if that expression is well-formed,
* otherwise calls @c __p->~_Tp()
*/
template<typename _Tp>
static void destroy(_Alloc& __a, _Tp* __p)
noexcept(noexcept(_S_destroy(__a, __p, 0)))
{ _S_destroy(__a, __p, 0); }
/**
* @brief The maximum supported allocation size
* @param __a An allocator.
* @return @c __a.max_size() or @c numeric_limits&#60size_type&#62::max()
*
* Returns @c __a.max_size() if that expression is well-formed,
* otherwise returns @c numeric_limits&#60size_type&#62::max()
*/
static size_type max_size(const _Alloc& __a) noexcept
{ return _S_max_size(__a, 0); }
/**
* @brief Obtain an allocator to use when copying a container.
* @param __rhs An allocator.
* @return @c __rhs.select_on_container_copy_construction() or @a __rhs
*
* Returns @c __rhs.select_on_container_copy_construction() if that
* expression is well-formed, otherwise returns @a __rhs
*/
static _Alloc
select_on_container_copy_construction(const _Alloc& __rhs)
{ return _S_select(__rhs, 0); }
};
///\ Partial\ specialization\ for\ std::allocator\.
template<typename _Tp>
struct allocator_traits<allocator<_Tp>>
{
///\ The\ allocator\ type
using allocator_type = allocator<_Tp>
///\ The\ allocated\ type
using value_type = _Tp;
///\ The\ allocator's\ pointer\ type\.
using pointer = _Tp*;
///\ The\ allocator's\ const\ pointer\ type\.
using const_pointer = const _Tp*;
///\ The\ allocator's\ void\ pointer\ type\.
using void_pointer = void*;
///\ The\ allocator's\ const\ void\ pointer\ type\.
using const_void_pointer = const void*;
///\ The\ allocator's\ difference\ type
using difference_type = std::ptrdiff_t;
///\ The\ allocator's\ size\ type
using size_type = std::size_t;
///\ How\ the\ allocator\ is\ propagated\ on\ copy\ assignment
using propagate_on_container_copy_assignment = false_type;
///\ How\ the\ allocator\ is\ propagated\ on\ move\ assignment
using propagate_on_container_move_assignment = true_type;
///\ How\ the\ allocator\ is\ propagated\ on\ swap
using propagate_on_container_swap = false_type;
///\ Whether\ all\ instances\ of\ the\ allocator\ type\ compare\ equal\.
using is_always_equal = true_type;
template<typename _Up>
using rebind_alloc = allocator<_Up>
template<typename _Up>
using rebind_traits = allocator_traits<allocator<_Up>>
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
*
* Calls @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
allocate(allocator_type& __a, size_type __n)
{ return __a.allocate(__n); }
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
* @param __hint Aid to locality.
* @return Memory of suitable size and alignment for @a n objects
* of type @c value_type
*
* Returns <tt> a.allocate(n, hint) </tt>
*/
_GLIBCXX_NODISCARD static pointer
allocate(allocator_type& __a, size_type __n, const_void_pointer __hint)
{ return __a.allocate(__n, __hint); }
/**
* @brief Deallocate memory.
* @param __a An allocator.
* @param __p Pointer to the memory to deallocate.
* @param __n The number of objects space was allocated for.
*
* Calls <tt> a.deallocate(p, n) </tt>
*/
static void
401c7755 push %rbp deallocate(allocator_type& __a, pointer __p, size_type __n)
401c8b48 8b 55 e8 mov -0x18(%rbp),%rdx { __a.deallocate(__p, __n); }
401ca290 nop
_ZSt8_DestroyIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEvT_S7_
/usr/include/c++/9/bits/stl_construct.h
//\ nonstandard\ construct\ and\ destroy\ functions\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_construct.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_CONSTRUCT_H
#define _STL_CONSTRUCT_H _STL_CONSTRUCT_H 1 _STL_CONSTRUCT_H 1
#include <new>
#include <bits/move.h>
#include <ext/alloc_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _T1, typename... _Args>
inline void
_Construct(_T1* __p, _Args&&... __args)
{ ::new(static_cast&#60void*&#62(__p)) _T1(std::forward&#60_Args&#62(__args)...); }
#else
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 402\.\ wrong\ new\ expression\ in\ \[some_\]allocator::construct
::new(static_cast&#60void*&#62(__p)) _T1(__value);
}
#endif
template<typename _T1>
inline void
_Construct_novalue(_T1* __p)
{ ::new(static_cast&#60void*&#62(__p)) _T1; }
/**
* Destroy the object pointed to by a pointer type.
*/
template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
template<bool>
struct _Destroy_aux
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator __first, _ForwardIterator __last)
{
for (; __first != __last; ++__first)
std::_Destroy(std::__addressof(*__first));
}
};
template<>
struct _Destroy_aux<true>
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator, _ForwardIterator) { }
};
/**
* Destroy a range of objects. If the value_type of the object has
* a trivial destructor, the compiler should optimize all of this
* away, otherwise the objects' destructors must be invoked.
*/
template<typename _ForwardIterator>
inline void
401ca555 push %rbp _Destroy(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_Value_type;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ A\ deleted\ destructor\ is\ trivial,\ this\ ensures\ we\ reject\ such\ types:
static_assert(is_destructible&#60_Value_type&#62::value,
"value type is destructible");
#endif
<span class="namespc">std</span>::_Destroy_aux&#60__has_trivial_destructor(_Value_type)&#62::
401cb548 8b 55 f0 mov -0x10(%rbp),%rdx __destroy(__first, __last);
401cc890 nop }
_ZSt7forwardINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEOT_RNSt16remove_referenceIS6_E4typeE
/usr/include/c++/9/bits/move.h
//\ Move,\ forward\ and\ identity\ for\ C11\ \ swap\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2007\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/move.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{utility}
*/
#ifndef _MOVE_H
#define _MOVE_H _MOVE_H 1 _MOVE_H 1
#include <bits/c++config.h>
#include <bits/concept_check.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ Used,\ in\ C03\ mode\ too,\ by\ allocators,\ etc\.
/**
* @brief Same as C++11 std::addressof
* @ingroup utilities
*/
template<typename _Tp>
inline _GLIBCXX_CONSTEXPR _Tp*
__addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
{ return __builtin_addressof(__r); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. clude <type_traits> <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Br<type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. gs <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> // Brings in std::declval <type_traits> //\ Brings\ in\ std::declval\ too\. <type_traits> //\ Brings\ in\ std::declval\ too\.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup utilities
* @{
*/
/**
* @brief Forward an lvalue.
* @return The parameter cast to the specified type.
*
* This function is used to implement "perfect forwarding".
*/
template<typename _Tp>
constexpr _Tp&&
401ccb55 push %rbp forward(typename <span class="namespc">std</span>::remove_reference&#60_Tp&#62::type& __t) noexcept
401cd348 8b 45 f8 mov -0x8(%rbp),%rax { return static_cast<_Tp&&>(__t); }
401cd75d pop %rbp
_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9constructIS5_JS5_EEEvRS6_PT_DpOT0_
/usr/include/c++/9/bits/alloc_traits.h
/**
* @brief Construct an object of type @a _Up
* @param __a An allocator.
* @param __p Pointer to memory of suitable size and alignment for Tp
* @param __args Constructor arguments.
*
* Calls <tt> __a.construct(__p, std::forward<Args>(__args)...) </tt>
*/
template<typename _Up, typename... _Args>
static void
401cd955 push %rbp construct(allocator_type& __a, _Up* __p, _Args&&... __args)
noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
401ced48 8b 45 e8 mov -0x18(%rbp),%rax { __a.construct(__p, std::forward<_Args>(__args)...); }
noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
401d0f90 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE3endEv
/usr/include/c++/9/bits/stl_vector.h
/**
* @brief %Vector assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied.
*
* Whether the allocator is copied depends on the allocator traits.
*/
vector&
operator=(const vector& __x);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* The contents of @a __x are moved into this %vector (without copying,
* if the allocators permit it).
* Afterwards @a __x is a valid, but unspecified %vector.
*
* Whether the allocator is moved depends on the allocator traits.
*/
vector&
operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
constexpr bool __move_storage =
_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal();
_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
return *this;
}
/**
* @brief %Vector list assignment operator.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
vector&
operator=(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
return *this;
}
#endif
/**
* @brief Assigns a given value to a %vector.
* @param __n Number of elements to be assigned.
* @param __val Value to be assigned.
*
* This function fills a %vector with @a __n copies of the given
* value. Note that the assignment completely changes the
* %vector and that the resulting %vector's size is the same as
* the number of elements assigned.
*/
void
assign(size_type __n, const value_type& __val)
{ _M_fill_assign(__n, __val); }
/**
* @brief Assigns a range to a %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function fills a %vector with copies of the elements in the
* range [__first,__last).
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
void
assign(_InputIterator __first, _InputIterator __last)
{ _M_assign_dispatch(__first, __last, __false_type()); }
#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Assigns an initializer list to a %vector.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
void
assign(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
}
#endif
///\ Get\ a\ copy\ of\ the\ memory\ allocation\ object\.
using _Base::get_allocator;
//\ iterators
/**
* Returns a read/write iterator that points to the first
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
begin() _GLIBCXX_NOEXCEPT
{ return iterator(this->_M_impl._M_start); }
/**
* Returns a read-only (constant) iterator that points to the
* first element in the %vector. Iteration is done in ordinary
* element order.
*/
const_iterator
begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(this->_M_impl._M_start); }
/**
* Returns a read/write iterator that points one past the last
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
401d1255 push %rbp end() _GLIBCXX_NOEXCEPT
401d1e48 8b 45 e8 mov -0x18(%rbp),%rax { return iterator(this->_M_impl._M_finish); }
401d2648 8d 45 f8 lea -0x8(%rbp),%rax
401d39c9 leaveq
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_S_use_relocateEv
protected:
void
_M_create_storage(size_t __n)
{
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_finish = this->_M_impl._M_start;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
};
/**
* @brief A standard container which offers fixed time access to
* individual elements in any order.
*
* @ingroup sequences
*
* @tparam _Tp Type of element.
* @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>, including the
* <a href="tables.html#68">optional sequence requirements</a> with the
* %exception of @c push_front and @c pop_front.
*
* In some terminology a %vector can be described as a dynamic
* C-style array, it offers fast and efficient access to individual
* elements in any order and saves the user from worrying about
* memory and size allocation. Subscripting ( @c [] ) access is
* also provided as with C-style arrays.
*/
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ Concept\ requirements\.
typedef typename _Alloc::value_type _Alloc_value_type;
# if if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L &#60 if __cplusplus < 201103L
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
# endif
__glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>c<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>t<span class="namespc"></span>(<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>v<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
"std::vector must have a non-const, non-volatile value_type");
# ifdef ifdef __STRICT_ANSI__ ifdef __STRICT_ANSI__
static_assert(is_same&#60typename _<span class="namespc">Alloc</span>::value_type, _Tp&#62::value,
"std::vector must have the same value_type as its allocator");
# endif
#endif
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type;
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
static constexpr bool
_S_nothrow_relocate(true_type)
{
return noexcept(std::__relocate_a(std::declval<pointer>(),
std::declval<pointer>(),
std::declval<pointer>(),
std::declval<_Tp_alloc_type&>()));
}
static constexpr bool
_S_nothrow_relocate(false_type)
{ return false; }
static constexpr bool
401d3b55 push %rbp _S_use_relocate()
{
//\ Instantiating\ std::__relocate_a\ might\ cause\ an\ error\ outside\ the
//\ immediate\ context\ \(in\ __relocate_object_a's\ noexcept\-specifier\),
//\ so\ only\ do\ it\ if\ we\ know\ the\ type\ can\ be\ move\-inserted\ into\ \*this\.
401d43e8 02 00 00 00 callq401d4a_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE19_S_nothrow_relocateESt17integral_constantIbLb1EE return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
401d48c9 leaveq }
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE19_S_nothrow_relocateESt17integral_constantIbLb1EE
protected:
void
_M_create_storage(size_t __n)
{
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_finish = this->_M_impl._M_start;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
};
/**
* @brief A standard container which offers fixed time access to
* individual elements in any order.
*
* @ingroup sequences
*
* @tparam _Tp Type of element.
* @tparam _Alloc Allocator type, defaults to allocator<_Tp>.
*
* Meets the requirements of a <a href="tables.html#65">container</a>, a
* <a href="tables.html#66">reversible container</a>, and a
* <a href="tables.html#67">sequence</a>, including the
* <a href="tables.html#68">optional sequence requirements</a> with the
* %exception of @c push_front and @c pop_front.
*
* In some terminology a %vector can be described as a dynamic
* C-style array, it offers fast and efficient access to individual
* elements in any order and saves the user from worrying about
* memory and size allocation. Subscripting ( @c [] ) access is
* also provided as with C-style arrays.
*/
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ Concept\ requirements\.
typedef typename _Alloc::value_type _Alloc_value_type;
# if if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L if __cplusplus if __cplusplus < if __cplusplus < 201103L if __cplusplus < 201103L &#60 if __cplusplus < 201103L
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
# endif
__glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>c<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>t<span class="namespc"></span>(<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>v<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
"std::vector must have a non-const, non-volatile value_type");
# ifdef ifdef __STRICT_ANSI__ ifdef __STRICT_ANSI__
static_assert(is_same&#60typename _<span class="namespc">Alloc</span>::value_type, _Tp&#62::value,
"std::vector must have the same value_type as its allocator");
# endif
#endif
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Base::pointer pointer;
typedef typename _Alloc_traits::const_pointer const_pointer;
typedef typename _Alloc_traits::reference reference;
typedef typename _Alloc_traits::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Alloc allocator_type;
private:
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
static constexpr bool
401d4a55 push %rbp _S_nothrow_relocate(true_type)
{
return noexcept(std::__relocate_a(std::declval<pointer>(),
std::declval<pointer>(),
std::declval<pointer>(),
401d4eb8 01 00 00 00 mov $0x1,%eax std::declval<_Tp_alloc_type&>()));
401d535d pop %rbp }
401d5590 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_
/usr/include/c++/9/bits/vector.tcc
#endif
template<typename _Tp, typename _Alloc>
typename vector&#60_Tp, _Alloc&#62::iterator
vector&#60_Tp, _Alloc&#62::
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
insert(const_iterator __position, const value_type& __x)
#else
insert(iterator __position, const value_type& __x)
#endif
{
const size_type __n = __position - begin();
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
if (__position == end())
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
__x);
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
const auto __pos = begin() + (__position - cbegin());
//\ __x\ could\ be\ an\ existing\ element\ of\ this\ vector,\ so\ make\ a
//\ copy\ of\ it\ before\ _M_insert_aux\ moves\ elements\ around\.
_Temporary_value __x_copy(this, __x);
_M_insert_aux(__pos, std::move(__x_copy._M_val()));
#else
_M_insert_aux(__position, __x);
#endif
}
else
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
_M_realloc_insert(begin() + (__position - cbegin()), __x);
#else
_M_realloc_insert(__position, __x);
#endif
return iterator(this->_M_impl._M_start + __n);
}
template<typename _Tp, typename _Alloc>
typename vector&#60_Tp, _Alloc&#62::iterator
vector&#60_Tp, _Alloc&#62::
_M_erase(iterator __position)
{
if (__position + 1 != end())
_GLIBCXX_MOVE3(__position + 1, end(), __position);
--this->_M_impl._M_finish;
_Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
_GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
return __position;
}
template<typename _Tp, typename _Alloc>
typename vector&#60_Tp, _Alloc&#62::iterator
vector&#60_Tp, _Alloc&#62::
_M_erase(iterator __first, iterator __last)
{
if (__first != __last)
{
if (__last != end())
_GLIBCXX_MOVE3(__last, end(), __first);
_M_erase_at_end(__first.base() + (end() - __last));
}
return __first;
}
template<typename _Tp, typename _Alloc>
vector<_Tp, _Alloc>&
vector&#60_Tp, _Alloc&#62::
operator=(const vector<_Tp, _Alloc>& __x)
{
if (&__x != this)
{
_GLIBCXX_ASAN_ANNOTATE_REINIT;
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
if (_Alloc_traits::_S_propagate_on_copy_assign())
{
if (!_Alloc_traits::_S_always_equal()
&& _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
{
//\ replacement\ allocator\ cannot\ free\ existing\ storage
this->clear();
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = nullptr;
this->_M_impl._M_finish = nullptr;
this->_M_impl._M_end_of_storage = nullptr;
}
std::__alloc_on_copy(_M_get_Tp_allocator(),
__x._M_get_Tp_allocator());
}
#endif
const size_type __xlen = __x.size();
if (__xlen > capacity())
{
pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),
__x.end());
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __tmp;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;
}
else if (size() >= __xlen)
{
std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),
end(), _M_get_Tp_allocator());
}
else
{
std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),
this->_M_impl._M_start);
std::__uninitialized_copy_a(__x._M_impl._M_start + size(),
__x._M_impl._M_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
}
this->_M_impl._M_finish = this->_M_impl._M_start + __xlen;
}
return *this;
}
template<typename _Tp, typename _Alloc>
void
vector&#60_Tp, _Alloc&#62::
_M_fill_assign(size_t __n, const value_type& __val)
{
if (__n > capacity())
{
vector __tmp(__n, __val, _M_get_Tp_allocator());
__tmp._M_impl._M_swap_data(this->_M_impl);
}
else if (__n > size())
{
std::fill(begin(), end(), __val);
const size_type __add = __n - size();
_GLIBCXX_ASAN_ANNOTATE_GROW(__add);
this->_M_impl._M_finish =
std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
__add, __val, _M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_GREW(__add);
}
else
_M_erase_at_end(std::fill_n(this->_M_impl._M_start, __n, __val));
}
template<typename _Tp, typename _Alloc>
template<typename _InputIterator>
void
vector&#60_Tp, _Alloc&#62::
_M_assign_aux(_InputIterator __first, _InputIterator __last,
std::input_iterator_tag)
{
pointer __cur(this->_M_impl._M_start);
for (; __first != __last && __cur != this->_M_impl._M_finish;
++__cur, (void)++__first)
*__cur = *__first;
if (__first == __last)
_M_erase_at_end(__cur);
else
_M_range_insert(end(), __first, __last,
std::__iterator_category(__first));
}
template<typename _Tp, typename _Alloc>
template<typename _ForwardIterator>
void
vector&#60_Tp, _Alloc&#62::
_M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
std::forward_iterator_tag)
{
const size_type __len = std::distance(__first, __last);
if (__len > capacity())
{
_S_check_init_len(__len, _M_get_Tp_allocator());
pointer __tmp(_M_allocate_and_copy(__len, __first, __last));
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_REINIT;
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __tmp;
this->_M_impl._M_finish = this->_M_impl._M_start + __len;
this->_M_impl._M_end_of_storage = this->_M_impl._M_finish;
}
else if (size() >= __len)
_M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start));
else
{
_ForwardIterator __mid = __first;
std::advance(__mid, size());
std::copy(__first, __mid, this->_M_impl._M_start);
const size_type __attribute__((__unused__)) __n = __len - size();
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_GREW(__n);
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
auto
vector&#60_Tp, _Alloc&#62::
_M_insert_rval(const_iterator __position, value_type&& __v) -> iterator
{
const auto __n = __position - cbegin();
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
if (__position == cend())
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
std::move(__v));
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
_M_insert_aux(begin() + __n, std::move(__v));
else
_M_realloc_insert(begin() + __n, std::move(__v));
return iterator(this->_M_impl._M_start + __n);
}
template<typename _Tp, typename _Alloc>
template<typename... _Args>
auto
vector&#60_Tp, _Alloc&#62::
_M_emplace_aux(const_iterator __position, _Args&&... __args)
-> iterator
{
const auto __n = __position - cbegin();
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
if (__position == cend())
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
std::forward<_Args>(__args)...);
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
}
else
{
//\ We\ need\ to\ construct\ a\ temporary\ because\ something\ in\ __args\.\.\.
//\ could\ alias\ one\ of\ the\ elements\ of\ the\ container\ and\ so\ we
//\ need\ to\ use\ it\ before\ _M_insert_aux\ moves\ elements\ around\.
_Temporary_value __tmp(this, std::forward<_Args>(__args)...);
_M_insert_aux(begin() + __n, std::move(__tmp._M_val()));
}
else
_M_realloc_insert(begin() + __n, std::forward<_Args>(__args)...);
return iterator(this->_M_impl._M_start + __n);
}
template<typename _Tp, typename _Alloc>
template<typename _Arg>
void
vector&#60_Tp, _Alloc&#62::
_M_insert_aux(iterator __position, _Arg&& __arg)
#else
template<typename _Tp, typename _Alloc>
void
vector&#60_Tp, _Alloc&#62::
_M_insert_aux(iterator __position, const _Tp& __x)
#endif
{
_GLIBCXX_ASAN_ANNOTATE_GROW(1);
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
_GLIBCXX_MOVE(*(this->_M_impl._M_finish - 1)));
++this->_M_impl._M_finish;
_GLIBCXX_ASAN_ANNOTATE_GREW(1);
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
_Tp __x_copy = __x;
#endif
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
this->_M_impl._M_finish - 2,
this->_M_impl._M_finish - 1);
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
*__position = __x_copy;
#else
*__position = std::forward<_Arg>(__arg);
#endif
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
template<typename... _Args>
void
401d5655 push %rbp vector&#60_Tp, _Alloc&#62::
_M_realloc_insert(iterator __position, _Args&&... __args)
#else
template<typename _Tp, typename _Alloc>
void
vector&#60_Tp, _Alloc&#62::
_M_realloc_insert(iterator __position, const _Tp& __x)
#endif
{
401d6b48 8b 45 a8 mov -0x58(%rbp),%rax const size_type __len =
_M_check_len(size_type(1), "vector::_M_realloc_insert");
401d8548 8b 45 a8 mov -0x58(%rbp),%rax pointer __old_start = this->_M_impl._M_start;
401d9048 8b 45 a8 mov -0x58(%rbp),%rax pointer __old_finish = this->_M_impl._M_finish;
401d9c48 8b 45 a8 mov -0x58(%rbp),%rax const size_type __elems_before = __position - begin();
401dbf48 89 45 c8 mov %rax,-0x38(%rbp)
401dc348 8b 45 a8 mov -0x58(%rbp),%rax pointer __new_start(this->_M_allocate(__len));
401dda48 8b 45 c0 mov -0x40(%rbp),%rax pointer __new_finish(__new_start);
__try
{
//\ The\ order\ of\ the\ three\ operations\ is\ dictated\ by\ the\ C11
//\ case,\ where\ the\ moves\ could\ alter\ a\ new\ element\ belonging
//\ to\ the\ existing\ vector\.\ \ This\ is\ an\ issue\ only\ for\ callers
//\ taking\ the\ element\ by\ lvalue\ ref\ \(see\ last\ bullet\ of\ C11
//\ \[res\.on\.arguments\]\)\.
401de248 8b 45 98 mov -0x68(%rbp),%rax _Alloc_traits::construct(this->_M_impl,
401df148 8b 45 c8 mov -0x38(%rbp),%rax __new_start + __elems_before,
__try
{
//\ The\ order\ of\ the\ three\ operations\ is\ dictated\ by\ the\ C11
//\ case,\ where\ the\ moves\ could\ alter\ a\ new\ element\ belonging
//\ to\ the\ existing\ vector\.\ \ This\ is\ an\ issue\ only\ for\ callers
//\ taking\ the\ element\ by\ lvalue\ ref\ \(see\ last\ bullet\ of\ C11
//\ \[res\.on\.arguments\]\)\.
401dfc48 8b 45 c0 mov -0x40(%rbp),%rax _Alloc_traits::construct(this->_M_impl,
__try
{
//\ The\ order\ of\ the\ three\ operations\ is\ dictated\ by\ the\ C11
//\ case,\ where\ the\ moves\ could\ alter\ a\ new\ element\ belonging
//\ to\ the\ existing\ vector\.\ \ This\ is\ an\ issue\ only\ for\ callers
//\ taking\ the\ element\ by\ lvalue\ ref\ \(see\ last\ bullet\ of\ C11
//\ \[res\.on\.arguments\]\)\.
401e0348 8b 45 a8 mov -0x58(%rbp),%rax
__try
{
//\ The\ order\ of\ the\ three\ operations\ is\ dictated\ by\ the\ C11
//\ case,\ where\ the\ moves\ could\ alter\ a\ new\ element\ belonging
//\ to\ the\ existing\ vector\.\ \ This\ is\ an\ issue\ only\ for\ callers
//\ taking\ the\ element\ by\ lvalue\ ref\ \(see\ last\ bullet\ of\ C11
//\ \[res\.on\.arguments\]\)\.
401e0748 89 ce mov %rcx,%rsi
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
std::forward<_Args>(__args)...);
#else
__x);
#endif
401e1248 c7 45 e8 00 00 00 movq $0x0,-0x18(%rbp) __new_finish = pointer();
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401e1ae8 1c ff ff ff callq401d3b_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_S_use_relocateEv if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401e1f84 c0 test %al,%al
{
__new_finish = _S_relocate(__old_start, __position.base(),
401e2348 8b 45 a8 mov -0x58(%rbp),%rax __new_start, _M_get_Tp_allocator());
{
401e3248 8d 45 a0 lea -0x60(%rbp),%rax __new_finish = _S_relocate(__old_start, __position.base(),
401e5848 83 45 e8 20 addq $0x20,-0x18(%rbp) ++__new_finish;
__new_finish = _S_relocate(__position.base(), __old_finish,
401e5d48 8b 45 a8 mov -0x58(%rbp),%rax __new_finish, _M_get_Tp_allocator());
401e6c48 8d 45 a0 lea -0x60(%rbp),%rax __new_finish = _S_relocate(__position.base(), __old_finish,
}
else
#endif
{
__new_finish
= std::__uninitialized_move_if_noexcept_a
(__old_start, __position.base(),
401e9448 8b 45 a8 mov -0x58(%rbp),%rax __new_start, _M_get_Tp_allocator());
}
else
#endif
{
__new_finish
= std::__uninitialized_move_if_noexcept_a
401ea348 8d 45 a0 lea -0x60(%rbp),%rax (__old_start, __position.base(),
401ec948 83 45 e8 20 addq $0x20,-0x18(%rbp) ++__new_finish;
__new_finish
= std::__uninitialized_move_if_noexcept_a
(__position.base(), __old_finish,
401ece48 8b 45 a8 mov -0x58(%rbp),%rax __new_finish, _M_get_Tp_allocator());
__new_finish
= std::__uninitialized_move_if_noexcept_a
401edd48 8d 45 a0 lea -0x60(%rbp),%rax (__position.base(), __old_finish,
__new_finish
= std::__uninitialized_move_if_noexcept_a
401eff48 89 45 e8 mov %rax,-0x18(%rbp)
}
}
__catch(...)
{
if (!__new_finish)
_Alloc_traits::destroy(this->_M_impl,
__new_start + __elems_before);
else
std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401f03e8 33 fe ff ff callq401d3b_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE15_S_use_relocateEv if _GLIBCXX17_CONSTEXPR (!_S_use_relocate())
}
}
__catch(...)
{
if (!__new_finish)
_Alloc_traits::destroy(this->_M_impl,
__new_start + __elems_before);
else
std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401f0883 f0 01 xor $0x1,%eax
}
}
__catch(...)
{
if (!__new_finish)
_Alloc_traits::destroy(this->_M_impl,
__new_start + __elems_before);
else
std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
401f0b84 c0 test %al,%al
#endif
401f0f48 8b 45 a8 mov -0x58(%rbp),%rax std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
#endif
401f1e48 8b 4d d0 mov -0x30(%rbp),%rcx
_GLIBCXX_ASAN_ANNOTATE_REINIT;
401f3148 8b 45 a8 mov -0x58(%rbp),%rax _M_deallocate(__old_start,
401f3548 8b 55 a8 mov -0x58(%rbp),%rdx this->_M_impl._M_end_of_storage - __old_start);
401f3d48 2b 55 d8 sub -0x28(%rbp),%rdx
_GLIBCXX_ASAN_ANNOTATE_REINIT;
401f4548 8b 4d d8 mov -0x28(%rbp),%rcx _M_deallocate(__old_start,
401f5448 8b 45 a8 mov -0x58(%rbp),%rax this->_M_impl._M_start = __new_start;
401f5f48 8b 45 a8 mov -0x58(%rbp),%rax this->_M_impl._M_finish = __new_finish;
401f6b48 8b 45 e0 mov -0x20(%rbp),%rax this->_M_impl._M_end_of_storage = __new_start + __len;
401f7d48 8b 45 a8 mov -0x58(%rbp),%rax
401f85e9 83 00 00 00 jmpq 40200d }
}
}
401f8a48 89 c7 mov %rax,%rdi __catch(...)
{
401f9248 83 7d e8 00 cmpq $0x0,-0x18(%rbp) if (!__new_finish)
_Alloc_traits::destroy(this->_M_impl,
401f9948 8b 45 c8 mov -0x38(%rbp),%rax __new_start + __elems_before);
401fa448 8b 45 c0 mov -0x40(%rbp),%rax _Alloc_traits::destroy(this->_M_impl,
401fab48 8b 45 a8 mov -0x58(%rbp),%rax
401faf48 89 d6 mov %rdx,%rsi
else
401fbc48 8b 45 a8 mov -0x58(%rbp),%rax std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
else
401fcb48 8b 4d e8 mov -0x18(%rbp),%rcx
401fde48 8b 45 a8 mov -0x58(%rbp),%rax _M_deallocate(__new_start, __len);
401ff5e8 56 f1 ff ff callq401150__cxa_rethrow@plt __throw_exception_again;
}
}
401ffde8 7e f1 ff ff callq401180__cxa_end_catch@plt __catch(...)
40200d48 83 c4 68 add $0x68,%rsp }
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS7_
/usr/include/c++/9/ext/new_allocator.h
_GLIBCXX20_CONSTEXPR
40201455 push %rbp new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
_GLIBCXX20_CONSTEXPR
40202090 nop
_GLIBCXX20_CONSTEXPR
40202390 nop
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE10deallocateEPS6_m
pointer
address(reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
const_pointer
address(const_reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
//\ NB:\ __n\ is\ permitted\ to\ be\ 0\.\ \ The\ C\ standard\ says\ nothing
//\ about\ what\ the\ return\ value\ is\ when\ __n\ ==\ 0\.
_GLIBCXX_NODISCARD pointer
allocate(size_type __n, const void* = static_cast<const void*>(0))
{
if (__n > this->max_size())
std::__throw_bad_alloc();
#if __cpp_aligned_new
if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
{
std::align_val_t __al = std::align_val_t(alignof(_Tp));
return static_cast&#60_Tp*&#62(::operator new(__n * sizeof(_Tp), __al));
}
#endif
return static_cast&#60_Tp*&#62(::operator new(__n * sizeof(_Tp)));
}
//\ __p\ is\ not\ permitted\ to\ be\ a\ null\ pointer\.
void
40202455 push %rbp deallocate(pointer __p, size_type)
{
#if __cpp_aligned_new
if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
{
::operator delete(__p, std::align_val_t(alignof(_Tp)));
return;
}
#endif
40203848 8b 45 f0 mov -0x10(%rbp),%rax ::operator delete(__p);
40204490 nop }
_ZNSt12_Destroy_auxILb0EE9__destroyIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvT_S9_
/usr/include/c++/9/bits/stl_construct.h
//\ nonstandard\ construct\ and\ destroy\ functions\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_construct.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_CONSTRUCT_H
#define _STL_CONSTRUCT_H _STL_CONSTRUCT_H 1 _STL_CONSTRUCT_H 1
#include <new>
#include <bits/move.h>
#include <ext/alloc_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _T1, typename... _Args>
inline void
_Construct(_T1* __p, _Args&&... __args)
{ ::new(static_cast&#60void*&#62(__p)) _T1(std::forward&#60_Args&#62(__args)...); }
#else
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 402\.\ wrong\ new\ expression\ in\ \[some_\]allocator::construct
::new(static_cast&#60void*&#62(__p)) _T1(__value);
}
#endif
template<typename _T1>
inline void
_Construct_novalue(_T1* __p)
{ ::new(static_cast&#60void*&#62(__p)) _T1; }
/**
* Destroy the object pointed to by a pointer type.
*/
template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
template<bool>
struct _Destroy_aux
{
template<typename _ForwardIterator>
static void
40204755 push %rbp __destroy(_ForwardIterator __first, _ForwardIterator __last)
{
40205748 8b 45 f8 mov -0x8(%rbp),%rax for (; __first != __last; ++__first)
40206148 8b 45 f8 mov -0x8(%rbp),%rax std::_Destroy(std::__addressof(*__first));
{
40207548 83 45 f8 20 addq $0x20,-0x8(%rbp) for (; __first != __last; ++__first)
40207c90 nop }
40207f90 nop
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE9constructIS6_JS6_EEEvPT_DpOT0_
/usr/include/c++/9/ext/new_allocator.h
size_type
max_size() const _GLIBCXX_USE_NOEXCEPT
{
#if __PTRDIFF_MAX__ __PTRDIFF_MAX__ < __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __SIZE_MAX__
return size_t(__PTRDIFF_MAX__) / sizeof(_Tp);
#else
return size_t(-1) / sizeof(_Tp);
#endif
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Up, typename... _Args>
void
40208055 push %rbp construct(_Up* __p, _Args&&... __args)
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
40209548 8b 45 d8 mov -0x28(%rbp),%rax { ::new((void *)__p) _Up(std::forward&#60_Args&#62(__args)...); }
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
4020a448 8b 45 e0 mov -0x20(%rbp),%rax
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
4020a848 89 c6 mov %rax,%rsi
noexcept(noexcept(::new((void *)__p)
_Up(std::forward<_Args>(__args)...)))
4020c090 nop
_ZN9__gnu_cxx17__normal_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIS6_SaIS6_EEEC1ERKS7_
/usr/include/c++/9/bits/stl_iterator.h
//\ Iterators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996-1998
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_iterator.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{iterator}
*
* This file implements reverse_iterator, back_insert_iterator,
* front_insert_iterator, insert_iterator, __normal_iterator, and their
* supporting functions and overloaded operators.
*/
#ifndef _STL_ITERATOR_H
#define _STL_ITERATOR_H _STL_ITERATOR_H 1 _STL_ITERATOR_H 1
#include <bits/cpp_type_traits.h>
#include <ext/type_traits.h>
#include <bits/move.h>
#include <bits/ptr_traits.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# include include <type_traits> &#60type_traits&#62
#endif
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
# define define __cpp_lib_array_constexpr define __cpp_lib_array_constexpr 201603 define __cpp_lib_array_constexpr 201603 define __cpp_lib_array_constexpr define __cpp_lib_array_constexpr 201603 define __cpp_lib_array_constexpr 201603
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @addtogroup iterators
* @{
*/
//\ 24\.4\.1\ Reverse\ iterators
/**
* Bidirectional and random access iterators have corresponding reverse
* %iterator adaptors that iterate through the data structure in the
* opposite direction. They have the same signatures as the corresponding
* iterators. The fundamental relation between a reverse %iterator and its
* corresponding %iterator @c i is established by the identity:
* @code
* &*(reverse_iterator(i)) == &*(i - 1)
* @endcode
*
* <em>This mapping is dictated by the fact that while there is always a
* pointer past the end of an array, there might not be a valid pointer
* before the beginning of an array.</em> [24.4.1]/1,2
*
* Reverse iterators can be tricky and surprising at first. Their
* semantics make sense, however, and the trickiness is a side effect of
* the requirement that the iterators must be safe.
*/
template<typename _Iterator>
class reverse_iterator
: public iterator&#60typename iterator_traits&#60_Iterator&#62::iterator_category,
typename iterator_traits&#60_Iterator&#62::value_type,
typename iterator_traits&#60_Iterator&#62::difference_type,
typename iterator_traits&#60_Iterator&#62::pointer,
typename iterator_traits&#60_Iterator&#62::reference&#62
{
protected:
_Iterator current;
typedef iterator_traits<_Iterator> __traits_type;
public:
typedef _Iterator iterator_type;
typedef typename __traits_type::difference_type difference_type;
typedef typename __traits_type::pointer pointer;
typedef typename __traits_type::reference reference;
/**
* The default constructor value-initializes member @p current.
* If it is a pointer, that means it is zero-initialized.
*/
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 235\ No\ specification\ of\ default\ ctor\ for\ reverse_iterator
//\ 1012\.\ reverse_iterator\ default\ ctor\ should\ value\ initialize
_GLIBCXX17_CONSTEXPR
reverse_iterator() : current() { }
/**
* This %iterator will move in the opposite direction that @p x does.
*/
explicit _GLIBCXX17_CONSTEXPR
reverse_iterator(iterator_type __x) : current(__x) { }
/**
* The copy constructor is normal.
*/
_GLIBCXX17_CONSTEXPR
reverse_iterator(const reverse_iterator& __x)
: current(__x.current) { }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
reverse_iterator& operator=(const reverse_iterator&) = default;
#endif
/**
* A %reverse_iterator across other types can be copied if the
* underlying %iterator can be converted to the type of @c current.
*/
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
reverse_iterator(const reverse_iterator<_Iter>& __x)
: current(__x.base()) { }
/**
* @return @c current, the %iterator used for underlying work.
*/
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return current; }
/**
* @return A reference to the value at @c --current
*
* This requires that @c --current is dereferenceable.
*
* @warning This implementation requires that for an iterator of the
* underlying iterator type, @c x, a reference obtained by
* @c *x remains valid after @c x has been modified or
* destroyed. This is a bug: http://gcc\.gnu\.org/PR51823
*/
_GLIBCXX17_CONSTEXPR reference
operator*() const
{
_Iterator __tmp = current;
return *--__tmp;
}
/**
* @return A pointer to the value at @c --current
*
* This requires that @c --current is dereferenceable.
*/
_GLIBCXX17_CONSTEXPR pointer
operator->() const
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 1052\.\ operator\-&\#62\ should\ also\ support\ smart\ pointers
_Iterator __tmp = current;
--__tmp;
return _S_to_pointer(__tmp);
}
/**
* @return @c *this
*
* Decrements the underlying iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator++()
{
--current;
return *this;
}
/**
* @return The original value of @c *this
*
* Decrements the underlying iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator
operator++(int)
{
reverse_iterator __tmp = *this;
--current;
return __tmp;
}
/**
* @return @c *this
*
* Increments the underlying iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator--()
{
++current;
return *this;
}
/**
* @return A reverse_iterator with the previous value of @c *this
*
* Increments the underlying iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator
operator--(int)
{
reverse_iterator __tmp = *this;
++current;
return __tmp;
}
/**
* @return A reverse_iterator that refers to @c current - @a __n
*
* The underlying iterator must be a Random Access Iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator
operator+(difference_type __n) const
{ return reverse_iterator(current - __n); }
/**
* @return *this
*
* Moves the underlying iterator backwards @a __n steps.
* The underlying iterator must be a Random Access Iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator+=(difference_type __n)
{
current -= __n;
return *this;
}
/**
* @return A reverse_iterator that refers to @c current - @a __n
*
* The underlying iterator must be a Random Access Iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator
operator-(difference_type __n) const
{ return reverse_iterator(current + __n); }
/**
* @return *this
*
* Moves the underlying iterator forwards @a __n steps.
* The underlying iterator must be a Random Access Iterator.
*/
_GLIBCXX17_CONSTEXPR reverse_iterator&
operator-=(difference_type __n)
{
current += __n;
return *this;
}
/**
* @return The value at @c current - @a __n - 1
*
* The underlying iterator must be a Random Access Iterator.
*/
_GLIBCXX17_CONSTEXPR reference
operator[](difference_type __n) const
{ return *(*this + __n); }
private:
template<typename _Tp>
static _GLIBCXX17_CONSTEXPR _Tp*
_S_to_pointer(_Tp* __p)
{ return __p; }
template<typename _Tp>
static _GLIBCXX17_CONSTEXPR pointer
_S_to_pointer(_Tp __t)
{ return __t.operator->(); }
};
//@\{
/**
* @param __x A %reverse_iterator.
* @param __y A %reverse_iterator.
* @return A simple bool.
*
* Reverse iterators forward many operations to their underlying base()
* iterators. Others are implemented in terms of one another.
*
*/
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return __x.base() == __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator<(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return __y.base() < __x.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator!=(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return !(__x == __y); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator>(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return __y < __x; }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator<=(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return !(__y < __x); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator>=(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return !(__x < __y); }
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 280\.\ Comparison\ of\ reverse_iterator\ to\ const\ reverse_iterator\.
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return __x.base() == __y.base(); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator<(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return __y.base() < __x.base(); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator!=(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return !(__x == __y); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator>(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return __y < __x; }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator<=(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return !(__y < __x); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator>=(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return !(__x < __y); }
//@\}
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
template<typename _Iterator>
inline typename reverse_iterator&#60_Iterator&#62::difference_type
operator-(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
{ return __y.base() - __x.base(); }
template<typename _IteratorL, typename _IteratorR>
inline typename reverse_iterator&#60_IteratorL&#62::difference_type
operator-(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
{ return __y.base() - __x.base(); }
#else
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 685\.\ reverse_iterator/move_iterator\ difference\ has\ invalid\ signatures
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR auto
operator-(const reverse_iterator<_IteratorL>& __x,
const reverse_iterator<_IteratorR>& __y)
-> decltype(__y.base() - __x.base())
{ return __y.base() - __x.base(); }
#endif
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
operator+(typename reverse_iterator&#60_Iterator&#62::difference_type __n,
const reverse_iterator<_Iterator>& __x)
{ return reverse_iterator<_Iterator>(__x.base() - __n); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Same\ as\ C14\ make_reverse_iterator\ but\ used\ in\ C11\ mode\ too\.
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
__make_reverse_iterator(_Iterator __i)
{ return reverse_iterator<_Iterator>(__i); }
# if if __cplusplus if __cplusplus > if __cplusplus > 201103L if __cplusplus > 201103L if __cplusplus > if __cplusplus > 201103L if __cplusplus > 201103L if __cplusplus if __cplusplus > if __cplusplus > 201103L if __cplusplus > 201103L &#62 if __cplusplus > 201103L
# define define __cpp_lib_make_reverse_iterator define __cpp_lib_make_reverse_iterator 201402 define __cpp_lib_make_reverse_iterator 201402 define __cpp_lib_make_reverse_iterator define __cpp_lib_make_reverse_iterator 201402 define __cpp_lib_make_reverse_iterator 201402
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 2285\.\ make_reverse_iterator
///\ Generator\ function\ for\ reverse_iterator\.
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
make_reverse_iterator(_Iterator __i)
{ return reverse_iterator<_Iterator>(__i); }
# endif
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Iterator>
auto
__niter_base(reverse_iterator<_Iterator> __it)
-> decltype(__make_reverse_iterator(__niter_base(__it.base())))
{ return __make_reverse_iterator(__niter_base(__it.base())); }
template<typename _Iterator>
struct __is_move_iterator<reverse_iterator<_Iterator> >
: __is_move_iterator<_Iterator>
{ };
template<typename _Iterator>
auto
__miter_base(reverse_iterator<_Iterator> __it)
-> decltype(__make_reverse_iterator(__miter_base(__it.base())))
{ return __make_reverse_iterator(__miter_base(__it.base())); }
#endif
//\ 24\.4\.2\.2\.1\ back_insert_iterator
/**
* @brief Turns assignment into insertion.
*
* These are output iterators, constructed from a container-of-T.
* Assigning a T to the iterator appends it to the container using
* push_back.
*
* Tip: Using the back_inserter function to create these iterators can
* save typing.
*/
template<typename _Container>
class back_insert_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
protected:
_Container* container;
public:
///\ A\ nested\ typedef\ for\ the\ type\ of\ whatever\ container\ you\ used\.
typedef _Container container_type;
///\ The\ only\ way\ to\ create\ this\ %iterator\ is\ with\ a\ container\.
explicit
back_insert_iterator(_Container& __x)
: container(std::__addressof(__x)) { }
/**
* @param __value An instance of whatever type
* container_type::const_reference is; presumably a
* reference-to-const T for container<T>.
* @return This %iterator, for chained operations.
*
* This kind of %iterator doesn't really have a @a position in the
* container (you can think of the position as being permanently at
* the end, if you like). Assigning a value to the %iterator will
* always append the value to the end of the container.
*/
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
back_insert_iterator&
operator=(typename _Container::const_reference __value)
{
container->push_back(__value);
return *this;
}
#else
back_insert_iterator&
operator=(const typename _Container::value_type& __value)
{
container->push_back(__value);
return *this;
}
back_insert_iterator&
operator=(typename _Container::value_type&& __value)
{
container->push_back(std::move(__value));
return *this;
}
#endif
///\ Simply\ returns\ \*this\.
back_insert_iterator&
operator*()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
back_insert_iterator&
operator++()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
back_insert_iterator
operator++(int)
{ return *this; }
};
/**
* @param __x A container of arbitrary type.
* @return An instance of back_insert_iterator working on @p __x.
*
* This wrapper function helps in creating back_insert_iterator instances.
* Typing the name of the %iterator requires knowing the precise full
* type of the container, which can be tedious and impedes generic
* programming. Using this function lets you take advantage of automatic
* template parameter deduction, making the compiler match the correct
* types for you.
*/
template<typename _Container>
inline back_insert_iterator<_Container>
back_inserter(_Container& __x)
{ return back_insert_iterator<_Container>(__x); }
/**
* @brief Turns assignment into insertion.
*
* These are output iterators, constructed from a container-of-T.
* Assigning a T to the iterator prepends it to the container using
* push_front.
*
* Tip: Using the front_inserter function to create these iterators can
* save typing.
*/
template<typename _Container>
class front_insert_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
protected:
_Container* container;
public:
///\ A\ nested\ typedef\ for\ the\ type\ of\ whatever\ container\ you\ used\.
typedef _Container container_type;
///\ The\ only\ way\ to\ create\ this\ %iterator\ is\ with\ a\ container\.
explicit front_insert_iterator(_Container& __x)
: container(std::__addressof(__x)) { }
/**
* @param __value An instance of whatever type
* container_type::const_reference is; presumably a
* reference-to-const T for container<T>.
* @return This %iterator, for chained operations.
*
* This kind of %iterator doesn't really have a @a position in the
* container (you can think of the position as being permanently at
* the front, if you like). Assigning a value to the %iterator will
* always prepend the value to the front of the container.
*/
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
front_insert_iterator&
operator=(typename _Container::const_reference __value)
{
container->push_front(__value);
return *this;
}
#else
front_insert_iterator&
operator=(const typename _Container::value_type& __value)
{
container->push_front(__value);
return *this;
}
front_insert_iterator&
operator=(typename _Container::value_type&& __value)
{
container->push_front(std::move(__value));
return *this;
}
#endif
///\ Simply\ returns\ \*this\.
front_insert_iterator&
operator*()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
front_insert_iterator&
operator++()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
front_insert_iterator
operator++(int)
{ return *this; }
};
/**
* @param __x A container of arbitrary type.
* @return An instance of front_insert_iterator working on @p x.
*
* This wrapper function helps in creating front_insert_iterator instances.
* Typing the name of the %iterator requires knowing the precise full
* type of the container, which can be tedious and impedes generic
* programming. Using this function lets you take advantage of automatic
* template parameter deduction, making the compiler match the correct
* types for you.
*/
template<typename _Container>
inline front_insert_iterator<_Container>
front_inserter(_Container& __x)
{ return front_insert_iterator<_Container>(__x); }
/**
* @brief Turns assignment into insertion.
*
* These are output iterators, constructed from a container-of-T.
* Assigning a T to the iterator inserts it in the container at the
* %iterator's position, rather than overwriting the value at that
* position.
*
* (Sequences will actually insert a @e copy of the value before the
* %iterator's position.)
*
* Tip: Using the inserter function to create these iterators can
* save typing.
*/
template<typename _Container>
class insert_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
protected:
_Container* container;
typename _Container::iterator iter;
public:
///\ A\ nested\ typedef\ for\ the\ type\ of\ whatever\ container\ you\ used\.
typedef _Container container_type;
/**
* The only way to create this %iterator is with a container and an
* initial position (a normal %iterator into the container).
*/
insert_iterator(_Container& __x, typename _Container::iterator __i)
: container(std::__addressof(__x)), iter(__i) {}
/**
* @param __value An instance of whatever type
* container_type::const_reference is; presumably a
* reference-to-const T for container<T>.
* @return This %iterator, for chained operations.
*
* This kind of %iterator maintains its own position in the
* container. Assigning a value to the %iterator will insert the
* value into the container at the place before the %iterator.
*
* The position is maintained such that subsequent assignments will
* insert values immediately after one another. For example,
* @code
* //\ vector\ v\ contains\ A\ and\ Z
*
* insert_iterator i (v, ++v.begin());
* i = 1;
* i = 2;
* i = 3;
*
* //\ vector\ v\ contains\ A,\ 1,\ 2,\ 3,\ and\ Z
* @endcode
*/
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
insert_iterator&
operator=(typename _Container::const_reference __value)
{
iter = container->insert(iter, __value);
++iter;
return *this;
}
#else
insert_iterator&
operator=(const typename _Container::value_type& __value)
{
iter = container->insert(iter, __value);
++iter;
return *this;
}
insert_iterator&
operator=(typename _Container::value_type&& __value)
{
iter = container->insert(iter, std::move(__value));
++iter;
return *this;
}
#endif
///\ Simply\ returns\ \*this\.
insert_iterator&
operator*()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
insert_iterator&
operator++()
{ return *this; }
///\ Simply\ returns\ \*this\.\ \ \(This\ %iterator\ does\ not\ @a\ move\.\)
insert_iterator&
operator++(int)
{ return *this; }
};
/**
* @param __x A container of arbitrary type.
* @param __i An iterator into the container.
* @return An instance of insert_iterator working on @p __x.
*
* This wrapper function helps in creating insert_iterator instances.
* Typing the name of the %iterator requires knowing the precise full
* type of the container, which can be tedious and impedes generic
* programming. Using this function lets you take advantage of automatic
* template parameter deduction, making the compiler match the correct
* types for you.
*/
template<typename _Container, typename _Iterator>
inline insert_iterator<_Container>
inserter(_Container& __x, _Iterator __i)
{
return insert_iterator<_Container>(__x,
typename _Container::iterator(__i));
}
//\ @\}\ group\ iterators
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ This\ iterator\ adapter\ is\ @a\ normal\ in\ the\ sense\ that\ it\ does\ not
//\ change\ the\ semantics\ of\ any\ of\ the\ operators\ of\ its\ iterator
//\ parameter\.\ \ Its\ primary\ purpose\ is\ to\ convert\ an\ iterator\ that\ is
//\ not\ a\ class,\ e\.g\.\ a\ pointer,\ into\ an\ iterator\ that\ is\ a\ class\.
//\ The\ _Container\ parameter\ exists\ solely\ so\ that\ different\ containers
//\ using\ this\ template\ can\ instantiate\ different\ types,\ even\ if\ the
//\ _Iterator\ parameter\ is\ the\ same\.
using std::iterator_traits;
using std::iterator;
template<typename _Iterator, typename _Container>
class __normal_iterator
{
protected:
_Iterator _M_current;
typedef iterator_traits<_Iterator> __traits_type;
public:
typedef _Iterator iterator_type;
typedef typename __traits_type::iterator_category iterator_category;
typedef typename __traits_type::value_type value_type;
typedef typename __traits_type::difference_type difference_type;
typedef typename __traits_type::reference reference;
typedef typename __traits_type::pointer pointer;
_GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
: _M_current(_Iterator()) { }
explicit
4020c855 push %rbp __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
4020d448 8b 45 f0 mov -0x10(%rbp),%rax : _M_current(__i) { }
4020e290 nop
4020e590 nop
_ZNKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12_M_check_lenEmPKc
/usr/include/c++/9/bits/stl_vector.h
template<typename... _Args>
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
reference
#else
void
#endif
emplace_back(_Args&&... __args);
#endif
/**
* @brief Removes last element.
*
* This is a typical stack operation. It shrinks the %vector by one.
*
* Note that no data is returned, and if the last element's
* data is needed, it should be retrieved before pop_back() is
* called.
*/
void
pop_back() _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_nonempty();
--this->_M_impl._M_finish;
_Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
_GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Inserts an object in %vector before specified iterator.
* @param __position A const_iterator into the %vector.
* @param __args Arguments.
* @return An iterator that points to the inserted data.
*
* This function will insert an object of type T constructed
* with T(std::forward<Args>(args)...) before the specified location.
* Note that this kind of operation could be expensive for a %vector
* and if it is frequently used the user should consider using
* std::list.
*/
template<typename... _Args>
iterator
emplace(const_iterator __position, _Args&&... __args)
{ return _M_emplace_aux(__position, std::forward<_Args>(__args)...); }
/**
* @brief Inserts given value into %vector before specified iterator.
* @param __position A const_iterator into the %vector.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given value before
* the specified location. Note that this kind of operation
* could be expensive for a %vector and if it is frequently
* used the user should consider using std::list.
*/
iterator
insert(const_iterator __position, const value_type& __x);
#else
/**
* @brief Inserts given value into %vector before specified iterator.
* @param __position An iterator into the %vector.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given value before
* the specified location. Note that this kind of operation
* could be expensive for a %vector and if it is frequently
* used the user should consider using std::list.
*/
iterator
insert(iterator __position, const value_type& __x);
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Inserts given rvalue into %vector before specified iterator.
* @param __position A const_iterator into the %vector.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given rvalue before
* the specified location. Note that this kind of operation
* could be expensive for a %vector and if it is frequently
* used the user should consider using std::list.
*/
iterator
insert(const_iterator __position, value_type&& __x)
{ return _M_insert_rval(__position, std::move(__x)); }
/**
* @brief Inserts an initializer_list into the %vector.
* @param __position An iterator into the %vector.
* @param __l An initializer_list.
*
* This function will insert copies of the data in the
* initializer_list @a l into the %vector before the location
* specified by @a position.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
iterator
insert(const_iterator __position, initializer_list<value_type> __l)
{
auto __offset = __position - cbegin();
_M_range_insert(begin() + __offset, __l.begin(), __l.end(),
std::random_access_iterator_tag());
return begin() + __offset;
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Inserts a number of copies of given data into the %vector.
* @param __position A const_iterator into the %vector.
* @param __n Number of elements to be inserted.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a specified number of copies of
* the given data before the location specified by @a position.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
iterator
insert(const_iterator __position, size_type __n, const value_type& __x)
{
difference_type __offset = __position - cbegin();
_M_fill_insert(begin() + __offset, __n, __x);
return begin() + __offset;
}
#else
/**
* @brief Inserts a number of copies of given data into the %vector.
* @param __position An iterator into the %vector.
* @param __n Number of elements to be inserted.
* @param __x Data to be inserted.
*
* This function will insert a specified number of copies of
* the given data before the location specified by @a position.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
void
insert(iterator __position, size_type __n, const value_type& __x)
{ _M_fill_insert(__position, __n, __x); }
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Inserts a range into the %vector.
* @param __position A const_iterator into the %vector.
* @param __first An input iterator.
* @param __last An input iterator.
* @return An iterator that points to the inserted data.
*
* This function will insert copies of the data in the range
* [__first,__last) into the %vector before the location specified
* by @a pos.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __position, _InputIterator __first,
_InputIterator __last)
{
difference_type __offset = __position - cbegin();
_M_insert_dispatch(begin() + __offset,
__first, __last, __false_type());
return begin() + __offset;
}
#else
/**
* @brief Inserts a range into the %vector.
* @param __position An iterator into the %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function will insert copies of the data in the range
* [__first,__last) into the %vector before the location specified
* by @a pos.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
template<typename _InputIterator>
void
insert(iterator __position, _InputIterator __first,
_InputIterator __last)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_insert_dispatch(__position, __first, __last, _Integral());
}
#endif
/**
* @brief Remove element at given position.
* @param __position Iterator pointing to element to be erased.
* @return An iterator pointing to the next element (or end()).
*
* This function will erase the element at the given position and thus
* shorten the %vector by one.
*
* Note This operation could be expensive and if it is
* frequently used the user should consider using std::list.
* The user is also cautioned that this function only erases
* the element, and that if the element is itself a pointer,
* the pointed-to memory is not touched in any way. Managing
* the pointer is the user's responsibility.
*/
iterator
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
erase(const_iterator __position)
{ return _M_erase(begin() + (__position - cbegin())); }
#else
erase(iterator __position)
{ return _M_erase(__position); }
#endif
/**
* @brief Remove a range of elements.
* @param __first Iterator pointing to the first element to be erased.
* @param __last Iterator pointing to one past the last element to be
* erased.
* @return An iterator pointing to the element pointed to by @a __last
* prior to erasing (or end()).
*
* This function will erase the elements in the range
* [__first,__last) and shorten the %vector accordingly.
*
* Note This operation could be expensive and if it is
* frequently used the user should consider using std::list.
* The user is also cautioned that this function only erases
* the elements, and that if the elements themselves are
* pointers, the pointed-to memory is not touched in any way.
* Managing the pointer is the user's responsibility.
*/
iterator
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
erase(const_iterator __first, const_iterator __last)
{
const auto __beg = begin();
const auto __cbeg = cbegin();
return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
}
#else
erase(iterator __first, iterator __last)
{ return _M_erase(__first, __last); }
#endif
/**
* @brief Swaps data with another %vector.
* @param __x A %vector of the same element and allocator types.
*
* This exchanges the elements between two vectors in constant time.
* (Three pointers, so it should be quite fast.)
* Note that the global std::swap() function is specialized such that
* std::swap(v1,v2) will feed to this function.
*
* Whether the allocators are swapped depends on the allocator traits.
*/
void
swap(vector& __x) _GLIBCXX_NOEXCEPT
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
__glibcxx_assert(_Alloc_traits::propagate_on_container_swap::value
|| _M_get_Tp_allocator() == __x._M_get_Tp_allocator());
#endif
this->_M_impl._M_swap_data(__x._M_impl);
_Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
__x._M_get_Tp_allocator());
}
/**
* Erases all the elements. Note that this function only erases the
* elements, and that if the elements themselves are pointers, the
* pointed-to memory is not touched in any way. Managing the pointer is
* the user's responsibility.
*/
void
clear() _GLIBCXX_NOEXCEPT
{ _M_erase_at_end(this->_M_impl._M_start); }
protected:
/**
* Memory expansion handler. Uses the member allocation function to
* obtain @a n bytes of memory, and then copies [first,last) into it.
*/
template<typename _ForwardIterator>
pointer
_M_allocate_and_copy(size_type __n,
_ForwardIterator __first, _ForwardIterator __last)
{
pointer __result = this->_M_allocate(__n);
__try
{
std::__uninitialized_copy_a(__first, __last, __result,
_M_get_Tp_allocator());
return __result;
}
__catch(...)
{
_M_deallocate(__result, __n);
__throw_exception_again;
}
}
//\ Internal\ constructor\ functions\ follow\.
//\ Called\ by\ the\ range\ constructor\ to\ implement\ \[23\.1\.1\]/9
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 438\.\ Ambiguity\ in\ the\ "do\ the\ right\ thing"\ clause
template<typename _Integer>
void
_M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
{
this->_M_impl._M_start = _M_allocate(_S_check_init_len(
static_cast<size_type>(__n), _M_get_Tp_allocator()));
this->_M_impl._M_end_of_storage =
this->_M_impl._M_start + static_cast<size_type>(__n);
_M_fill_initialize(static_cast<size_type>(__n), __value);
}
//\ Called\ by\ the\ range\ constructor\ to\ implement\ \[23\.1\.1\]/9
template<typename _InputIterator>
void
_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
__false_type)
{
_M_range_initialize(__first, __last,
std::__iterator_category(__first));
}
#endif
//\ Called\ by\ the\ second\ initialize_dispatch\ above
template<typename _InputIterator>
void
_M_range_initialize(_InputIterator __first, _InputIterator __last,
std::input_iterator_tag)
{
__try {
for (; __first != __last; ++__first)
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
emplace_back(*__first);
#else
push_back(*__first);
#endif
} __catch(...) {
clear();
__throw_exception_again;
}
}
//\ Called\ by\ the\ second\ initialize_dispatch\ above
template<typename _ForwardIterator>
void
_M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
std::forward_iterator_tag)
{
const size_type __n = std::distance(__first, __last);
this->_M_impl._M_start
= this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__first, __last,
this->_M_impl._M_start,
_M_get_Tp_allocator());
}
//\ Called\ by\ the\ first\ initialize_dispatch\ above\ and\ by\ the
//\ vector\(n,value,a\)\ constructor\.
void
_M_fill_initialize(size_type __n, const value_type& __value)
{
this->_M_impl._M_finish =
std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
_M_get_Tp_allocator());
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Called\ by\ the\ vector\(n\)\ constructor\.
void
_M_default_initialize(size_type __n)
{
this->_M_impl._M_finish =
std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
_M_get_Tp_allocator());
}
#endif
//\ Internal\ assign\ functions\ follow\.\ \ The\ \*_aux\ functions\ do\ the\ actual
//\ assignment\ work\ for\ the\ range\ versions\.
//\ Called\ by\ the\ range\ assign\ to\ implement\ \[23\.1\.1\]/9
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 438\.\ Ambiguity\ in\ the\ "do\ the\ right\ thing"\ clause
template<typename _Integer>
void
_M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
{ _M_fill_assign(__n, __val); }
//\ Called\ by\ the\ range\ assign\ to\ implement\ \[23\.1\.1\]/9
template<typename _InputIterator>
void
_M_assign_dispatch(_InputIterator __first, _InputIterator __last,
__false_type)
{ _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
//\ Called\ by\ the\ second\ assign_dispatch\ above
template<typename _InputIterator>
void
_M_assign_aux(_InputIterator __first, _InputIterator __last,
std::input_iterator_tag);
//\ Called\ by\ the\ second\ assign_dispatch\ above
template<typename _ForwardIterator>
void
_M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
std::forward_iterator_tag);
//\ Called\ by\ assign\(n,t\),\ and\ the\ range\ assign\ when\ it\ turns\ out
//\ to\ be\ the\ same\ thing\.
void
_M_fill_assign(size_type __n, const value_type& __val);
//\ Internal\ insert\ functions\ follow\.
//\ Called\ by\ the\ range\ insert\ to\ implement\ \[23\.1\.1\]/9
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 438\.\ Ambiguity\ in\ the\ "do\ the\ right\ thing"\ clause
template<typename _Integer>
void
_M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
__true_type)
{ _M_fill_insert(__pos, __n, __val); }
//\ Called\ by\ the\ range\ insert\ to\ implement\ \[23\.1\.1\]/9
template<typename _InputIterator>
void
_M_insert_dispatch(iterator __pos, _InputIterator __first,
_InputIterator __last, __false_type)
{
_M_range_insert(__pos, __first, __last,
std::__iterator_category(__first));
}
//\ Called\ by\ the\ second\ insert_dispatch\ above
template<typename _InputIterator>
void
_M_range_insert(iterator __pos, _InputIterator __first,
_InputIterator __last, std::input_iterator_tag);
//\ Called\ by\ the\ second\ insert_dispatch\ above
template<typename _ForwardIterator>
void
_M_range_insert(iterator __pos, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag);
//\ Called\ by\ insert\(p,n,x\),\ and\ the\ range\ insert\ when\ it\ turns\ out\ to\ be
//\ the\ same\ thing\.
void
_M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Called\ by\ resize\(n\)\.
void
_M_default_append(size_type __n);
bool
_M_shrink_to_fit();
#endif
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
//\ Called\ by\ insert\(p,x\)
void
_M_insert_aux(iterator __position, const value_type& __x);
void
_M_realloc_insert(iterator __position, const value_type& __x);
#else
//\ A\ value_type\ object\ constructed\ with\ _Alloc_traits::construct\(\)
//\ and\ destroyed\ with\ _Alloc_traits::destroy\(\)\.
struct _Temporary_value
{
template<typename... _Args>
explicit
_Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
{
_Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
std::forward<_Args>(__args)...);
}
~_Temporary_value()
{ _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }
value_type&
_M_val() { return *_M_ptr(); }
private:
_Tp*
_M_ptr() { return reinterpret_cast<_Tp*>(&__buf); }
vector* _M_this;
typename aligned_storage&#60sizeof(_Tp), alignof(_Tp)&#62::type __buf;
};
//\ Called\ by\ insert\(p,x\)\ and\ other\ functions\ when\ insertion\ needs\ to
//\ reallocate\ or\ move\ existing\ elements\.\ _Arg\ is\ either\ _Tp&\ or\ _Tp\.
template<typename _Arg>
void
_M_insert_aux(iterator __position, _Arg&& __arg);
template<typename... _Args>
void
_M_realloc_insert(iterator __position, _Args&&... __args);
//\ Either\ move\-construct\ at\ the\ end,\ or\ forward\ to\ _M_insert_aux\.
iterator
_M_insert_rval(const_iterator __position, value_type&& __v);
//\ Try\ to\ emplace\ at\ the\ end,\ otherwise\ forward\ to\ _M_insert_aux\.
template<typename... _Args>
iterator
_M_emplace_aux(const_iterator __position, _Args&&... __args);
//\ Emplacing\ an\ rvalue\ of\ the\ correct\ type\ can\ use\ _M_insert_rval\.
iterator
_M_emplace_aux(const_iterator __position, value_type&& __v)
{ return _M_insert_rval(__position, std::move(__v)); }
#endif
//\ Called\ by\ _M_fill_insert,\ _M_insert_aux\ etc\.
size_type
4020e655 push %rbp _M_check_len(size_type __n, const char* __s) const
{
4020fb48 8b 45 d8 mov -0x28(%rbp),%rax if (max_size() - size() < __n)
{
40211c48 8b 45 d0 mov -0x30(%rbp),%rax
{
40212684 c0 test %al,%al
40212a48 8b 45 c8 mov -0x38(%rbp),%rax __throw_length_error(__N(__s));
40213648 8b 45 d8 mov -0x28(%rbp),%rax const size_type __len = size() + (std::max)(size(), __n);
40214548 8b 45 d8 mov -0x28(%rbp),%rax
40216848 8b 00 mov (%rax),%rax
40216b48 01 d8 add %rbx,%rax
40217248 8b 45 d8 mov -0x28(%rbp),%rax return (__len < size() || __len > max_size()) ? max_size() : __len;
40217e48 39 45 e8 cmp %rax,-0x18(%rbp)
40218448 8b 45 d8 mov -0x28(%rbp),%rax
40219048 39 45 e8 cmp %rax,-0x18(%rbp)
40219648 8b 45 d8 mov -0x28(%rbp),%rax
4021a448 8b 45 e8 mov -0x18(%rbp),%rax
4021a848 83 c4 38 add $0x38,%rsp }
4021af90 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE5beginEv
/**
* @brief %Vector assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* All the elements of @a __x are copied, but any unused capacity in
* @a __x will not be copied.
*
* Whether the allocator is copied depends on the allocator traits.
*/
vector&
operator=(const vector& __x);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief %Vector move assignment operator.
* @param __x A %vector of identical element and allocator types.
*
* The contents of @a __x are moved into this %vector (without copying,
* if the allocators permit it).
* Afterwards @a __x is a valid, but unspecified %vector.
*
* Whether the allocator is moved depends on the allocator traits.
*/
vector&
operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
{
constexpr bool __move_storage =
_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal();
_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
return *this;
}
/**
* @brief %Vector list assignment operator.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
vector&
operator=(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
return *this;
}
#endif
/**
* @brief Assigns a given value to a %vector.
* @param __n Number of elements to be assigned.
* @param __val Value to be assigned.
*
* This function fills a %vector with @a __n copies of the given
* value. Note that the assignment completely changes the
* %vector and that the resulting %vector's size is the same as
* the number of elements assigned.
*/
void
assign(size_type __n, const value_type& __val)
{ _M_fill_assign(__n, __val); }
/**
* @brief Assigns a range to a %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function fills a %vector with copies of the elements in the
* range [__first,__last).
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>>
void
assign(_InputIterator __first, _InputIterator __last)
{ _M_assign_dispatch(__first, __last, __false_type()); }
#else
template<typename _InputIterator>
void
assign(_InputIterator __first, _InputIterator __last)
{
//\ Check\ whether\ it's\ an\ integral\ type\.\ \ If\ so,\ it's\ not\ an\ iterator\.
typedef typename <span class="namespc">std</span>::__is_integer&#60_InputIterator&#62::__type _Integral;
_M_assign_dispatch(__first, __last, _Integral());
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Assigns an initializer list to a %vector.
* @param __l An initializer_list.
*
* This function fills a %vector with copies of the elements in the
* initializer list @a __l.
*
* Note that the assignment completely changes the %vector and
* that the resulting %vector's size is the same as the number
* of elements assigned.
*/
void
assign(initializer_list<value_type> __l)
{
this->_M_assign_aux(__l.begin(), __l.end(),
random_access_iterator_tag());
}
#endif
///\ Get\ a\ copy\ of\ the\ memory\ allocation\ object\.
using _Base::get_allocator;
//\ iterators
/**
* Returns a read/write iterator that points to the first
* element in the %vector. Iteration is done in ordinary
* element order.
*/
iterator
4021b055 push %rbp begin() _GLIBCXX_NOEXCEPT
4021bc48 8b 55 e8 mov -0x18(%rbp),%rdx { return iterator(this->_M_impl._M_start); }
4021c048 8d 45 f8 lea -0x8(%rbp),%rax
4021d3c9 leaveq
_ZN9__gnu_cxxmiIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIS6_SaIS6_EEEENS_17__normal_iteratorIT_T0_E15difference_typeERKSE_SH_
/usr/include/c++/9/bits/stl_iterator.h
//\ Allow\ iterator\ to\ const_iterator\ conversion
template<typename _Iter>
__normal_iterator(const __normal_iterator<_Iter,
typename __enable_if<
(<span class="namespc">std</span>::__are_same&#60_Iter, typename _<span class="namespc">Container</span>::pointer&#62::__value),
_Container&#62::__type&#62& __i) _GLIBCXX_NOEXCEPT
: _M_current(__i.base()) { }
//\ Forward\ iterator\ requirements
reference
operator*() const _GLIBCXX_NOEXCEPT
{ return *_M_current; }
pointer
operator->() const _GLIBCXX_NOEXCEPT
{ return _M_current; }
__normal_iterator&
operator++() _GLIBCXX_NOEXCEPT
{
++_M_current;
return *this;
}
__normal_iterator
operator++(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current++); }
//\ Bidirectional\ iterator\ requirements
__normal_iterator&
operator--() _GLIBCXX_NOEXCEPT
{
--_M_current;
return *this;
}
__normal_iterator
operator--(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current--); }
//\ Random\ access\ iterator\ requirements
reference
operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
{ return _M_current[__n]; }
__normal_iterator&
operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current += __n; return *this; }
__normal_iterator
operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current + __n); }
__normal_iterator&
operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current -= __n; return *this; }
__normal_iterator
operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current - __n); }
const _Iterator&
base() const _GLIBCXX_NOEXCEPT
{ return _M_current; }
};
//\ Note:\ In\ what\ follows,\ the\ left\-\ and\ right\-hand\-side\ iterators\ are
//\ allowed\ to\ vary\ in\ types\ \(conceptually\ in\ cv\-qualification\)\ so\ that
//\ comparison\ between\ cv\-qualified\ and\ non\-cv\-qualified\ iterators\ be
//\ valid\.\ \ However,\ the\ greedy\ and\ unfriendly\ operators\ in\ std::rel_ops
//\ will\ make\ overload\ resolution\ ambiguous\ \(when\ in\ scope\)\ if\ we\ don't
//\ provide\ overloads\ whose\ operands\ are\ of\ the\ same\ type\.\ \ Can\ someone
//\ remind\ me\ what\ generic\ programming\ is\ about\?\ \-\-\ Gaby
//\ Forward\ iterator\ requirements
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() == __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() == __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() != __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() != __rhs.base(); }
//\ Random\ access\ iterator\ requirements
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() < __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() < __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() > __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() > __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() <= __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() <= __rhs.base(); }
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool
operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() >= __rhs.base(); }
template<typename _Iterator, typename _Container>
inline bool
operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.base() >= __rhs.base(); }
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ According\ to\ the\ resolution\ of\ DR179\ not\ only\ the\ various\ comparison
//\ operators\ but\ also\ operator\-\ must\ accept\ mixed\ iterator/const_iterator
//\ parameters\.
template<typename _IteratorL, typename _IteratorR, typename _Container>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ DR\ 685\.
inline auto
operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
-> decltype(__lhs.base() - __rhs.base())
#else
inline typename __normal_iterator&#60_IteratorL, _Container&#62::difference_type
operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
const __normal_iterator<_IteratorR, _Container>& __rhs)
#endif
{ return __lhs.base() - __rhs.base(); }
template<typename _Iterator, typename _Container>
inline typename __normal_iterator&#60_Iterator, _Container&#62::difference_type
4021d555 push %rbp operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
4021e648 8b 45 e8 mov -0x18(%rbp),%rax { return __lhs.base() - __rhs.base(); }
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
40220a48 c1 f8 05 sar $0x5,%rax
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
40220e48 83 c4 18 add $0x18,%rsp
const __normal_iterator<_Iterator, _Container>& __rhs)
_GLIBCXX_NOEXCEPT
40221590 nop
_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm
/usr/include/c++/9/bits/stl_vector.h
public:
_Vector_impl _M_impl;
pointer
40221655 push %rbp _M_allocate(size_t __n)
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
40222648 83 7d f0 00 cmpq $0x0,-0x10(%rbp) return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
40222d48 8b 45 f8 mov -0x8(%rbp),%rax
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
40223148 8b 55 f0 mov -0x10(%rbp),%rdx
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
402240eb 05 jmp402247_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm+0x31
{
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
402242b8 00 00 00 00 mov $0x0,%eax
402247c9 leaveq }
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_S_relocateEPS5_S8_S8_RS6_
static pointer
_S_do_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc, true_type) noexcept
{
return std::__relocate_a(__first, __last, __result, __alloc);
}
static pointer
_S_do_relocate(pointer, pointer, pointer __result,
_Tp_alloc_type&, false_type) noexcept
{ return __result; }
static pointer
40224955 push %rbp _S_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc) noexcept
{
using __do_it = __bool_constant<_S_use_relocate()>
40226148 8b 4d d0 mov -0x30(%rbp),%rcx return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
402279c9 leaveq }
40227b90 nop
_ZNK9__gnu_cxx17__normal_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorIS6_SaIS6_EEE4baseEv
/usr/include/c++/9/bits/stl_iterator.h
//\ Allow\ iterator\ to\ const_iterator\ conversion
template<typename _Iter>
__normal_iterator(const __normal_iterator<_Iter,
typename __enable_if<
(<span class="namespc">std</span>::__are_same&#60_Iter, typename _<span class="namespc">Container</span>::pointer&#62::__value),
_Container&#62::__type&#62& __i) _GLIBCXX_NOEXCEPT
: _M_current(__i.base()) { }
//\ Forward\ iterator\ requirements
reference
operator*() const _GLIBCXX_NOEXCEPT
{ return *_M_current; }
pointer
operator->() const _GLIBCXX_NOEXCEPT
{ return _M_current; }
__normal_iterator&
operator++() _GLIBCXX_NOEXCEPT
{
++_M_current;
return *this;
}
__normal_iterator
operator++(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current++); }
//\ Bidirectional\ iterator\ requirements
__normal_iterator&
operator--() _GLIBCXX_NOEXCEPT
{
--_M_current;
return *this;
}
__normal_iterator
operator--(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current--); }
//\ Random\ access\ iterator\ requirements
reference
operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
{ return _M_current[__n]; }
__normal_iterator&
operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current += __n; return *this; }
__normal_iterator
operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current + __n); }
__normal_iterator&
operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
{ _M_current -= __n; return *this; }
__normal_iterator
operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current - __n); }
const _Iterator&
40227c55 push %rbp base() const _GLIBCXX_NOEXCEPT
40228448 8b 45 f8 mov -0x8(%rbp),%rax { return _M_current; }
4022885d pop %rbp
_ZSt34__uninitialized_move_if_noexcept_aIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_SaIS5_EET0_T_S9_S8_RT1_
/usr/include/c++/9/bits/stl_uninitialized.h
//\ Raw\ memory\ manipulators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_uninitialized.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_UNINITIALIZED_H
#define _STL_UNINITIALIZED_H _STL_UNINITIALIZED_H 1 _STL_UNINITIALIZED_H 1
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
#include <utility>
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<bool _TrivialValueTypes>
struct __uninitialized_copy
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
_ForwardIterator __cur = __result;
__try
{
for (; __first != __last; ++__first, (void)++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_copy<true>
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{ return std::copy(__first, __last, __result); }
};
/**
* @brief Copies the range [first,last) into result.
* @param __first An input iterator.
* @param __last An input iterator.
* @param __result An output iterator.
* @return __result + (__first - __last)
*
* Like copy(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
typedef typename iterator_traits&#60_InputIterator&#62::value_type
_ValueType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType2;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
typedef typename iterator_traits&#60_InputIterator&#62::reference _RefType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::reference _RefType2;
const bool __assignable = is_assignable&#60_RefType2, _RefType1&#62::value;
#endif
return std::__uninitialized_copy<__is_trivial(_ValueType1)
&& __is_trivial(_ValueType2)
&& __assignable&#62::
__uninit_copy(__first, __last, __result);
}
template<bool _TrivialValueType>
struct __uninitialized_fill
{
template<typename _ForwardIterator, typename _Tp>
static void
__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur), __x);
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_fill<true>
{
template<typename _ForwardIterator, typename _Tp>
static void
__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{ std::fill(__first, __last, __x); }
};
/**
* @brief Copies the value x into the range [first,last).
* @param __first An input iterator.
* @param __last An input iterator.
* @param __x The source value.
* @return Nothing.
*
* Like fill(), but does not require an initialized output range.
*/
template<typename _ForwardIterator, typename _Tp>
inline void
uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
#endif
<span class="namespc">std</span>::__uninitialized_fill&#60__is_trivial(_ValueType) && __assignable&#62::
__uninit_fill(__first, __last, __x);
}
template<bool _TrivialValueType>
struct __uninitialized_fill_n
{
template<typename _ForwardIterator, typename _Size, typename _Tp>
static _ForwardIterator
__uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct(std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_fill_n<true>
{
template<typename _ForwardIterator, typename _Size, typename _Tp>
static _ForwardIterator
__uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x)
{ return std::fill_n(__first, __n, __x); }
};
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 1339\.\ uninitialized_fill_n\ should\ return\ the\ end\ of\ its\ range
/**
* @brief Copies the value x into the range [first,first+n).
* @param __first An input iterator.
* @param __n The number of copies to make.
* @param __x The source value.
* @return Nothing.
*
* Like fill_n(), but does not require an initialized output range.
*/
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline _ForwardIterator
uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
#endif
return __uninitialized_fill_n&#60__is_trivial(_ValueType) && __assignable&#62::
__uninit_fill_n(__first, __n, __x);
}
//\ Extensions:\ versions\ of\ uninitialized_copy,\ uninitialized_fill,
//\ \ and\ uninitialized_fill_n\ that\ take\ an\ allocator\ parameter\.
//\ \ We\ dispatch\ back\ to\ the\ standard\ versions\ when\ we're\ given\ the
//\ \ default\ allocator\.\ \ For\ nondefault\ allocators\ we\ do\ not\ use\
//\ \ any\ of\ the\ POD\ optimizations\.
template<typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
_ForwardIterator
__uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
{
_ForwardIterator __cur = __result;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __first != __last; ++__first, (void)++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
inline _ForwardIterator
__uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, allocator<_Tp>&)
{ return std::uninitialized_copy(__first, __last, __result); }
template<typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
inline _ForwardIterator
__uninitialized_move_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
{
return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
_GLIBCXX_MAKE_MOVE_ITERATOR(__last),
__result, __alloc);
}
template<typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
inline _ForwardIterator
40228a55 push %rbp __uninitialized_move_if_noexcept_a(_InputIterator __first,
_InputIterator __last,
_ForwardIterator __result,
_Allocator& __alloc)
{
return std::__uninitialized_copy_a
4022a348 8b 45 e0 mov -0x20(%rbp),%rax (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first),
_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last), __result, __alloc);
4022d748 83 c4 28 add $0x28,%rsp }
_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7destroyIS5_EEvRS6_PT_
/usr/include/c++/9/bits/alloc_traits.h
/**
* @brief Destroy an object of type @a _Up
* @param __a An allocator.
* @param __p Pointer to the object to destroy
*
* Calls @c __a.destroy(__p).
*/
template<typename _Up>
static void
4022de55 push %rbp destroy(allocator_type& __a, _Up* __p)
noexcept(noexcept(__a.destroy(__p)))
4022ee48 8b 55 f0 mov -0x10(%rbp),%rdx { __a.destroy(__p); }
noexcept(noexcept(__a.destroy(__p)))
40230190 nop
_ZSt11__addressofINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEPT_RS6_
/usr/include/c++/9/bits/move.h
//\ Move,\ forward\ and\ identity\ for\ C11\ \ swap\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2007\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/move.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{utility}
*/
#ifndef _MOVE_H
#define _MOVE_H _MOVE_H 1 _MOVE_H 1
#include <bits/c++config.h>
#include <bits/concept_check.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ Used,\ in\ C03\ mode\ too,\ by\ allocators,\ etc\.
/**
* @brief Same as C++11 std::addressof
* @ingroup utilities
*/
template<typename _Tp>
inline _GLIBCXX_CONSTEXPR _Tp*
40230455 push %rbp __addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
40230c48 8b 45 f8 mov -0x8(%rbp),%rax { return __builtin_addressof(__r); }
4023105d pop %rbp
_ZSt8_DestroyINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEvPT_
/usr/include/c++/9/bits/stl_construct.h
//\ nonstandard\ construct\ and\ destroy\ functions\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_construct.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_CONSTRUCT_H
#define _STL_CONSTRUCT_H _STL_CONSTRUCT_H 1 _STL_CONSTRUCT_H 1
#include <new>
#include <bits/move.h>
#include <ext/alloc_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _T1, typename... _Args>
inline void
_Construct(_T1* __p, _Args&&... __args)
{ ::new(static_cast&#60void*&#62(__p)) _T1(std::forward&#60_Args&#62(__args)...); }
#else
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 402\.\ wrong\ new\ expression\ in\ \[some_\]allocator::construct
::new(static_cast&#60void*&#62(__p)) _T1(__value);
}
#endif
template<typename _T1>
inline void
_Construct_novalue(_T1* __p)
{ ::new(static_cast&#60void*&#62(__p)) _T1; }
/**
* Destroy the object pointed to by a pointer type.
*/
template<typename _Tp>
inline void
40231255 push %rbp _Destroy(_Tp* __pointer)
40231e48 8b 45 f8 mov -0x8(%rbp),%rax { __pointer->~_Tp(); }
40232a90 nop
40232d90 nop
_ZNKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE8max_sizeEv
/usr/include/c++/9/bits/stl_vector.h
/** Returns the size() of the largest possible %vector. */
size_type
40232e55 push %rbp max_size() const _GLIBCXX_NOEXCEPT
40233a48 8b 45 f8 mov -0x8(%rbp),%rax { return _S_max_size(_M_get_Tp_allocator()); }
40234648 89 c7 mov %rax,%rdi
40234ec9 leaveq
_ZSt3maxImERKT_S2_S2_
/usr/include/c++/9/bits/stl_algobase.h
//\ Core\ algorithmic\ facilities\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996-1998
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_algobase.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{algorithm}
*/
#ifndef _STL_ALGOBASE_H
#define _STL_ALGOBASE_H _STL_ALGOBASE_H 1 _STL_ALGOBASE_H 1
#include <bits/c++config.h>
#include <bits/functexcept.h>
#include <bits/cpp_type_traits.h>
#include <ext/type_traits.h>
#include <ext/numeric_traits.h>
#include <bits/stl_pair.h>
#include <bits/stl_iterator_base_types.h>
#include <bits/stl_iterator_base_funcs.h>
#include <bits/stl_iterator.h>
#include <bits/concept_check.h>
#include <debug/debug.h>
#include <bits/move.h> <bits/move.h> // <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap
#include <bits/predefined_ops.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# include include <type_traits> &#60type_traits&#62
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
// See http://gcc\.gnu\.org/ml/libstdc/2004\-08/msg00167\.html:\ in\ a
//\ nutshell,\ we\ are\ partially\ implementing\ the\ resolution\ of\ DR\ 187,
//\ when\ it's\ safe,\ i\.e\.,\ the\ value_types\ are\ equal\.
template<bool _BoolType>
struct __iter_swap
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
typedef typename iterator_traits&#60_ForwardIterator1&#62::value_type
_ValueType1;
_ValueType1 __tmp = *__a;
*__a = *__b;
*__b = __tmp;
}
};
template<>
struct __iter_swap<true>
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
swap(*__a, *__b);
}
};
#endif
/**
* @brief Swaps the contents of two iterators.
* @ingroup mutating_algorithms
* @param __a An iterator.
* @param __b Another iterator.
* @return Nothing.
*
* This function swaps the values pointed to by two iterators, not the
* iterators themselves.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
inline void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator1>)
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator2>)
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
typedef typename iterator_traits&#60_ForwardIterator1&#62::value_type
_ValueType1;
typedef typename iterator_traits&#60_ForwardIterator2&#62::value_type
_ValueType2;
__glibcxx_function_requires(_ConvertibleConcept<_ValueType1,
_ValueType2>)
__glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
_ValueType1>)
typedef typename iterator_traits&#60_ForwardIterator1&#62::reference
_ReferenceType1;
typedef typename iterator_traits&#60_ForwardIterator2&#62::reference
_ReferenceType2;
<span class="namespc">std</span>::__iter_swap&#60__are_same&#60_ValueType1, _ValueType2&#62::__value
&& __are_same&#60_ValueType1&, _ReferenceType1&#62::__value
<span class="namespc"></span> <span class="namespc"></span>&<span class="namespc"></span>&<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>2<span class="namespc"></span>&<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>R<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>2<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
iter_swap(__a, __b);
#else
swap(*__a, *__b);
#endif
}
/**
* @brief Swap the elements of two sequences.
* @ingroup mutating_algorithms
* @param __first1 A forward iterator.
* @param __last1 A forward iterator.
* @param __first2 A forward iterator.
* @return An iterator equal to @p first2+(last1-first1).
*
* Swaps each element in the range @p [first1,last1) with the
* corresponding element in the range @p [first2,(last1-first1)).
* The ranges must not overlap.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
_ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2)
{
//\ concept\ requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator1>)
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator2>)
__glibcxx_requires_valid_range(__first1, __last1);
for (; __first1 != __last1; ++__first1, (void)++__first2)
std::iter_swap(__first1, __first2);
return __first2;
}
/**
* @brief This does what you think it does.
* @ingroup sorting_algorithms
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @return The lesser of the parameters.
*
* This is the simple classic generic implementation. It will work on
* temporary expressions, since they are only evaluated once, unlike a
* preprocessor macro.
*/
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
min(const _Tp& __a, const _Tp& __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return\ __b\ &\#60\ __a\ \?\ __b\ :\ __a;
if (__b < __a)
return __b;
return __a;
}
/**
* @brief This does what you think it does.
* @ingroup sorting_algorithms
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @return The greater of the parameters.
*
* This is the simple classic generic implementation. It will work on
* temporary expressions, since they are only evaluated once, unlike a
* preprocessor macro.
*/
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
40235055 push %rbp max(const _Tp& __a, const _Tp& __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return\ \ __a\ &\#60\ __b\ \?\ __b\ :\ __a;
40235c48 8b 45 f8 mov -0x8(%rbp),%rax if (__a < __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return\ \ __a\ &\#60\ __b\ \?\ __b\ :\ __a;
40236a48 39 c2 cmp %rax,%rdx
40236f48 8b 45 f0 mov -0x10(%rbp),%rax return __b;
40237548 8b 45 f8 mov -0x8(%rbp),%rax return __a;
4023795d pop %rbp }
_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m
/usr/include/c++/9/bits/alloc_traits.h
//\ Allocator\ traits\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2011\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/** @file bits/alloc_traits.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _ALLOC_TRAITS_H
#define _ALLOC_TRAITS_H _ALLOC_TRAITS_H 1 _ALLOC_TRAITS_H 1
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <bits/memoryfwd.h>
#include <bits/ptr_traits.h>
#include <ext/numeric_traits.h>
#define __cpp_lib_allocator_traits_is_always_equal __cpp_lib_allocator_traits_is_always_equal 201411 __cpp_lib_allocator_traits_is_always_equal 201411
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __allocator_traits_base
{
template<typename _Tp, typename _Up, typename = void>
struct __rebind : __replace_first_arg<_Tp, _Up> { };
template<typename _Tp, typename _Up>
struct __rebind<_Tp, _Up,
__void_t&#60typename _<span class="namespc">Tp</span>::template rebind&#60_Up&#62::other&#62&#62
{ using type = typename _<span class="namespc">Tp</span>::template rebind&#60_Up&#62::other; };
protected:
template<typename _Tp>
using __pointer = typename _Tp::pointer;
template<typename _Tp>
using __c_pointer = typename _Tp::const_pointer;
template<typename _Tp>
using __v_pointer = typename _Tp::void_pointer;
template<typename _Tp>
using __cv_pointer = typename _Tp::const_void_pointer;
template<typename _Tp>
using __pocca = typename _Tp::propagate_on_container_copy_assignment;
template<typename _Tp>
using __pocma = typename _Tp::propagate_on_container_move_assignment;
template<typename _Tp>
using __pocs = typename _Tp::propagate_on_container_swap;
template<typename _Tp>
using __equal = typename _Tp::is_always_equal;
};
template<typename _Alloc, typename _Up>
using __alloc_rebind
= typename __allocator_traits_<span class="namespc">base</span>::template __rebind&#60_Alloc, _Up&#62::type;
/**
* @brief Uniform interface to all allocator types.
* @ingroup allocators
*/
template<typename _Alloc>
struct allocator_traits : __allocator_traits_base
{
///\ The\ allocator\ type
typedef _Alloc allocator_type;
///\ The\ allocated\ type
typedef typename _Alloc::value_type value_type;
/**
* @brief The allocator's pointer type.
*
* @c Alloc::pointer if that type exists, otherwise @c value_type*
*/
using pointer = __detected_or_t<value_type*, __pointer, _Alloc>
private:
<span class="comment">//\ Select\ _Func&\#60_Alloc&\#62\ or\ pointer_traits&\#60pointer&\#62::rebind&\#60_Tp&\#62</span>
template<template<typename> class _Func, typename _Tp, typename = void>
struct _Ptr
{
using type = typename pointer_traits&#60pointer&#62::template rebind&#60_Tp&#62;
};
template<template<typename> class _Func, typename _Tp>
struct _Ptr<_Func, _Tp, __void_t<_Func<_Alloc>>>
{
using type = _Func<_Alloc>
};
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>m<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>/<span class="namespc"></span>/<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>S<span class="namespc"></span>e<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>d<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>p<span class="namespc"></span>o<span class="namespc"></span>i<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>i<span class="namespc"></span>t<span class="namespc"></span>s<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>P<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>d<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span> <span class="namespc"></span>
template<typename _A2, typename _PtrT, typename = void>
struct _Diff
{ using type = typename pointer_traits&#60_PtrT&#62::difference_type; };
template<typename _A2, typename _PtrT>
struct _Diff&#60_A2, _PtrT, __void_t&#60typename _A2::difference_type&#62&#62
{ using type = typename _A2::difference_type; };
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>m<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>t<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>/<span class="namespc"></span>/<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>S<span class="namespc"></span>e<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>s<span class="namespc"></span>i<span class="namespc"></span>z<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>\<span class="namespc"></span> <span class="namespc"></span>m<span class="namespc"></span>a<span class="namespc"></span>k<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>u<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>i<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>e<span class="namespc"></span>d<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>D<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>f<span class="namespc"></span>T<span class="namespc"></span>&<span class="namespc"></span>\<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span> <span class="namespc"></span>
template<typename _A2, typename _DiffT, typename = void>
struct _Size : make_unsigned<_DiffT> { };
template<typename _A2, typename _DiffT>
struct _Size&#60_A2, _DiffT, __void_t&#60typename _A2::size_type&#62&#62
{ using type = typename _A2::size_type; };
public:
/**
* @brief The allocator's const pointer type.
*
* @c Alloc::const_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60const value_type&#62 &#60/tt&#62
*/
using const_pointer = typename _Ptr&#60__c_pointer, const value_type&#62::type;
/**
* @brief The allocator's void pointer type.
*
* @c Alloc::void_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60void&#62 &#60/tt&#62
*/
using void_pointer = typename _Ptr&#60__v_pointer, void&#62::type;
/**
* @brief The allocator's const void pointer type.
*
* @c Alloc::const_void_pointer if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::rebind&#60const void&#62 &#60/tt&#62
*/
using const_void_pointer = typename _Ptr&#60__cv_pointer, const void&#62::type;
/**
* @brief The allocator's difference type
*
* @c Alloc::difference_type if that type exists, otherwise
* &#60tt&#62 pointer_traits&#60pointer&#62::difference_type &#60/tt&#62
*/
using difference_type = typename _Diff&#60_Alloc, pointer&#62::type;
/**
* @brief The allocator's size type
*
* @c Alloc::size_type if that type exists, otherwise
* &#60tt&#62 make_unsigned&#60difference_type&#62::type &#60/tt&#62
*/
using size_type = typename _Size&#60_Alloc, difference_type&#62::type;
/**
* @brief How the allocator is propagated on copy assignment
*
* @c Alloc::propagate_on_container_copy_assignment if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_copy_assignment
= __detected_or_t<false_type, __pocca, _Alloc>
/**
* @brief How the allocator is propagated on move assignment
*
* @c Alloc::propagate_on_container_move_assignment if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_move_assignment
= __detected_or_t<false_type, __pocma, _Alloc>
/**
* @brief How the allocator is propagated on swap
*
* @c Alloc::propagate_on_container_swap if that type exists,
* otherwise @c false_type
*/
using propagate_on_container_swap
= __detected_or_t<false_type, __pocs, _Alloc>
/**
* @brief Whether all instances of the allocator type compare equal.
*
* @c Alloc::is_always_equal if that type exists,
* otherwise @c is_empty&#60Alloc&#62::type
*/
using is_always_equal
= __detected_or_t&#60typename is_empty&#60_Alloc&#62::type, __equal, _Alloc&#62;
template<typename _Tp>
using rebind_alloc = __alloc_rebind<_Alloc, _Tp>
template<typename _Tp>
using rebind_traits = allocator_traits<rebind_alloc<_Tp>>
private:
template<typename _Alloc2>
static auto
_S_allocate(_Alloc2& __a, size_type __n, const_void_pointer __hint, int)
-> decltype(__a.allocate(__n, __hint))
{ return __a.allocate(__n, __hint); }
template<typename _Alloc2>
static pointer
_S_allocate(_Alloc2& __a, size_type __n, const_void_pointer, ...)
{ return __a.allocate(__n); }
template<typename _Tp, typename... _Args>
struct __construct_helper
{
template<typename _Alloc2,
typename = decltype(std::declval<_Alloc2*>()->construct(
std::declval<_Tp*>(), std::declval<_Args>()...))>
static true_type __test(int);
template<typename>
static false_type __test(...);
using type = decltype(__test<_Alloc>(0));
};
template<typename _Tp, typename... _Args>
using __has_construct
= typename __construct_helper&#60_Tp, _Args...&#62::type;
template<typename _Tp, typename... _Args>
static _Require<__has_construct<_Tp, _Args...>>
_S_construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
{ __a.construct(__p, std::forward<_Args>(__args)...); }
template<typename _Tp, typename... _Args>
static
_Require<__and_<__not_<__has_construct<_Tp, _Args...>>,
is_constructible<_Tp, _Args...>>>
_S_construct(_Alloc&, _Tp* __p, _Args&&... __args)
noexcept(noexcept(::new((void*)__p)
_Tp(std::forward<_Args>(__args)...)))
{ ::new((void*)__p) _Tp(std::forward&#60_Args&#62(__args)...); }
template<typename _Alloc2, typename _Tp>
static auto
_S_destroy(_Alloc2& __a, _Tp* __p, int)
noexcept(noexcept(__a.destroy(__p)))
-> decltype(__a.destroy(__p))
{ __a.destroy(__p); }
template<typename _Alloc2, typename _Tp>
static void
_S_destroy(_Alloc2&, _Tp* __p, ...)
noexcept(noexcept(__p->~_Tp()))
{ __p->~_Tp(); }
template<typename _Alloc2>
static auto
_S_max_size(_Alloc2& __a, int)
-> decltype(__a.max_size())
{ return __a.max_size(); }
template<typename _Alloc2>
static size_type
_S_max_size(_Alloc2&, ...)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2466\.\ allocator_traits::max_size\(\)\ default\ behavior\ is\ incorrect
return __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60size_type&#62::__max
/ sizeof(value_type);
}
template<typename _Alloc2>
static auto
_S_select(_Alloc2& __a, int)
-> decltype(__a.select_on_container_copy_construction())
{ return __a.select_on_container_copy_construction(); }
template<typename _Alloc2>
static _Alloc2
_S_select(_Alloc2& __a, ...)
{ return __a; }
public:
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
*
* Calls @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
allocate(_Alloc& __a, size_type __n)
{ return __a.allocate(__n); }
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
* @param __hint Aid to locality.
* @return Memory of suitable size and alignment for @a n objects
* of type @c value_type
*
* Returns <tt> a.allocate(n, hint) </tt> if that expression is
* well-formed, otherwise returns @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
allocate(_Alloc& __a, size_type __n, const_void_pointer __hint)
{ return _S_allocate(__a, __n, __hint, 0); }
/**
* @brief Deallocate memory.
* @param __a An allocator.
* @param __p Pointer to the memory to deallocate.
* @param __n The number of objects space was allocated for.
*
* Calls <tt> a.deallocate(p, n) </tt>
*/
static void
deallocate(_Alloc& __a, pointer __p, size_type __n)
{ __a.deallocate(__p, __n); }
/**
* @brief Construct an object of type @a _Tp
* @param __a An allocator.
* @param __p Pointer to memory of suitable size and alignment for Tp
* @param __args Constructor arguments.
*
* Calls <tt> __a.construct(__p, std::forward<Args>(__args)...) </tt>
* if that expression is well-formed, otherwise uses placement-new
* to construct an object of type @a _Tp at location @a __p from the
* arguments @a __args...
*/
template<typename _Tp, typename... _Args>
static auto construct(_Alloc& __a, _Tp* __p, _Args&&... __args)
noexcept(noexcept(_S_construct(__a, __p,
std::forward<_Args>(__args)...)))
-> decltype(_S_construct(__a, __p, std::forward<_Args>(__args)...))
{ _S_construct(__a, __p, std::forward<_Args>(__args)...); }
/**
* @brief Destroy an object of type @a _Tp
* @param __a An allocator.
* @param __p Pointer to the object to destroy
*
* Calls @c __a.destroy(__p) if that expression is well-formed,
* otherwise calls @c __p->~_Tp()
*/
template<typename _Tp>
static void destroy(_Alloc& __a, _Tp* __p)
noexcept(noexcept(_S_destroy(__a, __p, 0)))
{ _S_destroy(__a, __p, 0); }
/**
* @brief The maximum supported allocation size
* @param __a An allocator.
* @return @c __a.max_size() or @c numeric_limits&#60size_type&#62::max()
*
* Returns @c __a.max_size() if that expression is well-formed,
* otherwise returns @c numeric_limits&#60size_type&#62::max()
*/
static size_type max_size(const _Alloc& __a) noexcept
{ return _S_max_size(__a, 0); }
/**
* @brief Obtain an allocator to use when copying a container.
* @param __rhs An allocator.
* @return @c __rhs.select_on_container_copy_construction() or @a __rhs
*
* Returns @c __rhs.select_on_container_copy_construction() if that
* expression is well-formed, otherwise returns @a __rhs
*/
static _Alloc
select_on_container_copy_construction(const _Alloc& __rhs)
{ return _S_select(__rhs, 0); }
};
///\ Partial\ specialization\ for\ std::allocator\.
template<typename _Tp>
struct allocator_traits<allocator<_Tp>>
{
///\ The\ allocator\ type
using allocator_type = allocator<_Tp>
///\ The\ allocated\ type
using value_type = _Tp;
///\ The\ allocator's\ pointer\ type\.
using pointer = _Tp*;
///\ The\ allocator's\ const\ pointer\ type\.
using const_pointer = const _Tp*;
///\ The\ allocator's\ void\ pointer\ type\.
using void_pointer = void*;
///\ The\ allocator's\ const\ void\ pointer\ type\.
using const_void_pointer = const void*;
///\ The\ allocator's\ difference\ type
using difference_type = std::ptrdiff_t;
///\ The\ allocator's\ size\ type
using size_type = std::size_t;
///\ How\ the\ allocator\ is\ propagated\ on\ copy\ assignment
using propagate_on_container_copy_assignment = false_type;
///\ How\ the\ allocator\ is\ propagated\ on\ move\ assignment
using propagate_on_container_move_assignment = true_type;
///\ How\ the\ allocator\ is\ propagated\ on\ swap
using propagate_on_container_swap = false_type;
///\ Whether\ all\ instances\ of\ the\ allocator\ type\ compare\ equal\.
using is_always_equal = true_type;
template<typename _Up>
using rebind_alloc = allocator<_Up>
template<typename _Up>
using rebind_traits = allocator_traits<allocator<_Up>>
/**
* @brief Allocate memory.
* @param __a An allocator.
* @param __n The number of objects to allocate space for.
*
* Calls @c a.allocate(n)
*/
_GLIBCXX_NODISCARD static pointer
40237b55 push %rbp allocate(allocator_type& __a, size_type __n)
40238b48 8b 4d f0 mov -0x10(%rbp),%rcx { return __a.allocate(__n); }
4023a3c9 leaveq
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE14_S_do_relocateEPS5_S8_S8_RS6_St17integral_constantIbLb1EE
/usr/include/c++/9/bits/stl_vector.h
static pointer
4023a555 push %rbp _S_do_relocate(pointer __first, pointer __last, pointer __result,
_Tp_alloc_type& __alloc, true_type) noexcept
{
4023bd48 8b 4d e0 mov -0x20(%rbp),%rcx return std::__relocate_a(__first, __last, __result, __alloc);
4023d5c9 leaveq }
_ZSt32__make_move_if_noexcept_iteratorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt13move_iteratorIPS5_EET0_PT_
/usr/include/c++/9/bits/stl_iterator.h
template<typename _Iterator, typename _Container>
inline __normal_iterator<_Iterator, _Container>
operator+(typename __normal_iterator&#60_Iterator, _Container&#62::difference_type
__n, const __normal_iterator<_Iterator, _Container>& __i)
_GLIBCXX_NOEXCEPT
{ return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Iterator, typename _Container>
_Iterator
__niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
_GLIBCXX_NOEXCEPT_IF(<span class="namespc">std</span>::is_nothrow_copy_constructible&#60_Iterator&#62::value)
{ return __it.base(); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @addtogroup iterators
* @{
*/
//\ 24\.4\.3\ \ Move\ iterators
/**
* Class template move_iterator is an iterator adapter with the same
* behavior as the underlying iterator except that its dereference
* operator implicitly converts the value returned by the underlying
* iterator's dereference operator to an rvalue reference. Some
* generic algorithms can be called with move iterators to replace
* copying with moving.
*/
template<typename _Iterator>
class move_iterator
{
protected:
_Iterator _M_current;
typedef iterator_traits<_Iterator> __traits_type;
typedef typename __traits_type::reference __base_ref;
public:
typedef _Iterator iterator_type;
typedef typename __traits_type::iterator_category iterator_category;
typedef typename __traits_type::value_type value_type;
typedef typename __traits_type::difference_type difference_type;
//\ NB:\ DR\ 680\.
typedef _Iterator pointer;
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2106\.\ move_iterator\ wrapping\ iterators\ returning\ prvalues
typedef typename conditional&#60is_reference&#60__base_ref&#62::value,
typename remove_reference&#60__base_ref&#62::type&&,
__base_ref&#62::type reference;
_GLIBCXX17_CONSTEXPR
move_iterator()
: _M_current() { }
explicit _GLIBCXX17_CONSTEXPR
move_iterator(iterator_type __i)
: _M_current(__i) { }
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR reference
operator*() const
{ return static_cast<reference>(*_M_current); }
_GLIBCXX17_CONSTEXPR pointer
operator->() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR move_iterator&
operator++()
{
++_M_current;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator++(int)
{
move_iterator __tmp = *this;
++_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator&
operator--()
{
--_M_current;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator--(int)
{
move_iterator __tmp = *this;
--_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator+(difference_type __n) const
{ return move_iterator(_M_current + __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator+=(difference_type __n)
{
_M_current += __n;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator-(difference_type __n) const
{ return move_iterator(_M_current - __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator-=(difference_type __n)
{
_M_current -= __n;
return *this;
}
_GLIBCXX17_CONSTEXPR reference
operator[](difference_type __n) const
{ return std::move(_M_current[__n]); }
};
//\ Note:\ See\ __normal_iterator\ operators\ note\ from\ Gaby\ to\ understand
//\ why\ there\ are\ always\ 2\ versions\ for\ most\ of\ the\ move_iterator
//\ operators\.
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return __x.base() == __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return __x.base() == __y.base(); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator!=(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return !(__x == __y); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator!=(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return !(__x == __y); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator<(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return __x.base() < __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator<(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return __x.base() < __y.base(); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator<=(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return !(__y < __x); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator<=(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return !(__y < __x); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator>(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return __y < __x; }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator>(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return __y < __x; }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator>=(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return !(__x < __y); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator>=(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return !(__x < __y); }
//\ DR\ 685\.
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR auto
operator-(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
-> decltype(__x.base() - __y.base())
{ return __x.base() - __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
operator+(typename move_iterator&#60_Iterator&#62::difference_type __n,
const move_iterator<_Iterator>& __x)
{ return __x + __n; }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
make_move_iterator(_Iterator __i)
{ return move_iterator<_Iterator>(__i); }
template<typename _Iterator, typename _ReturnType
= typename conditional<__move_if_noexcept_cond
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>i<span class="namespc"></span>t<span class="namespc"></span>s<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>I<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>
_Iterator, move_iterator&#60_Iterator&#62&#62::type&#62
inline _GLIBCXX17_CONSTEXPR _ReturnType
__make_move_if_noexcept_iterator(_Iterator __i)
{ return _ReturnType(__i); }
//\ Overload\ for\ pointers\ that\ matches\ std::move_if_noexcept\ more\ closely,
//\ returning\ a\ constant\ iterator\ when\ we\ don't\ want\ to\ move\.
template<typename _Tp, typename _ReturnType
= typename conditional&#60__move_if_noexcept_cond&#60_Tp&#62::value,
const _Tp*, move_iterator&#60_Tp*&#62&#62::type&#62
inline _GLIBCXX17_CONSTEXPR _ReturnType
4023d755 push %rbp __make_move_if_noexcept_iterator(_Tp* __i)
4023e348 8b 55 e8 mov -0x18(%rbp),%rdx { return _ReturnType(__i); }
4023fac9 leaveq
_ZSt22__uninitialized_copy_aISt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEES7_S6_ET0_T_SA_S9_RSaIT1_E
/usr/include/c++/9/bits/stl_uninitialized.h
//\ Raw\ memory\ manipulators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_uninitialized.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_UNINITIALIZED_H
#define _STL_UNINITIALIZED_H _STL_UNINITIALIZED_H 1 _STL_UNINITIALIZED_H 1
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
#include <utility>
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<bool _TrivialValueTypes>
struct __uninitialized_copy
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
_ForwardIterator __cur = __result;
__try
{
for (; __first != __last; ++__first, (void)++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_copy<true>
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{ return std::copy(__first, __last, __result); }
};
/**
* @brief Copies the range [first,last) into result.
* @param __first An input iterator.
* @param __last An input iterator.
* @param __result An output iterator.
* @return __result + (__first - __last)
*
* Like copy(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
typedef typename iterator_traits&#60_InputIterator&#62::value_type
_ValueType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType2;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
typedef typename iterator_traits&#60_InputIterator&#62::reference _RefType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::reference _RefType2;
const bool __assignable = is_assignable&#60_RefType2, _RefType1&#62::value;
#endif
return std::__uninitialized_copy<__is_trivial(_ValueType1)
&& __is_trivial(_ValueType2)
&& __assignable&#62::
__uninit_copy(__first, __last, __result);
}
template<bool _TrivialValueType>
struct __uninitialized_fill
{
template<typename _ForwardIterator, typename _Tp>
static void
__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur), __x);
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_fill<true>
{
template<typename _ForwardIterator, typename _Tp>
static void
__uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{ std::fill(__first, __last, __x); }
};
/**
* @brief Copies the value x into the range [first,last).
* @param __first An input iterator.
* @param __last An input iterator.
* @param __x The source value.
* @return Nothing.
*
* Like fill(), but does not require an initialized output range.
*/
template<typename _ForwardIterator, typename _Tp>
inline void
uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
#endif
<span class="namespc">std</span>::__uninitialized_fill&#60__is_trivial(_ValueType) && __assignable&#62::
__uninit_fill(__first, __last, __x);
}
template<bool _TrivialValueType>
struct __uninitialized_fill_n
{
template<typename _ForwardIterator, typename _Size, typename _Tp>
static _ForwardIterator
__uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct(std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_fill_n<true>
{
template<typename _ForwardIterator, typename _Size, typename _Tp>
static _ForwardIterator
__uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x)
{ return std::fill_n(__first, __n, __x); }
};
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 1339\.\ uninitialized_fill_n\ should\ return\ the\ end\ of\ its\ range
/**
* @brief Copies the value x into the range [first,first+n).
* @param __first An input iterator.
* @param __n The number of copies to make.
* @param __x The source value.
* @return Nothing.
*
* Like fill_n(), but does not require an initialized output range.
*/
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline _ForwardIterator
uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
#endif
return __uninitialized_fill_n&#60__is_trivial(_ValueType) && __assignable&#62::
__uninit_fill_n(__first, __n, __x);
}
//\ Extensions:\ versions\ of\ uninitialized_copy,\ uninitialized_fill,
//\ \ and\ uninitialized_fill_n\ that\ take\ an\ allocator\ parameter\.
//\ \ We\ dispatch\ back\ to\ the\ standard\ versions\ when\ we're\ given\ the
//\ \ default\ allocator\.\ \ For\ nondefault\ allocators\ we\ do\ not\ use\
//\ \ any\ of\ the\ POD\ optimizations\.
template<typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
_ForwardIterator
__uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
{
_ForwardIterator __cur = __result;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __first != __last; ++__first, (void)++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
inline _ForwardIterator
4023fc55 push %rbp __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, allocator<_Tp>&)
40241448 8b 55 e8 mov -0x18(%rbp),%rdx { return std::uninitialized_copy(__first, __last, __result); }
_ForwardIterator __result, allocator<_Tp>&)
40242bc9 leaveq
_ForwardIterator __result, allocator<_Tp>&)
40242d90 nop
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE7destroyIS6_EEvPT_
/usr/include/c++/9/ext/new_allocator.h
template<typename _Up>
void
40242e55 push %rbp destroy(_Up* __p)
noexcept(noexcept( __p->~_Up()))
40243e48 8b 45 f0 mov -0x10(%rbp),%rax { __p->~_Up(); }
noexcept(noexcept( __p->~_Up()))
40244a90 nop
_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_S_max_sizeERKS6_
/usr/include/c++/9/bits/stl_vector.h
//\ Called\ by\ constructors\ to\ check\ initial\ size\.
static size_type
_S_check_init_len(size_type __n, const allocator_type& __a)
{
if (__n > _S_max_size(_Tp_alloc_type(__a)))
__throw_length_error(
__N("cannot create std::vector larger than max_size()"));
return __n;
}
static size_type
40244d55 push %rbp _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
{
//\ std::distance\(begin\(\),\ end\(\)\)\ cannot\ be\ greater\ than\ PTRDIFF_MAX,
//\ and\ realistically\ we\ can't\ store\ more\ than\ PTRDIFF_MAX/sizeof\(T\)
//\ \(even\ if\ std::allocator_traits::max_size\ says\ we\ can\)\.
40245948 b8 ff ff ff ff ff movabs $0x3ffffffffffffff,%rax const size_t __diffmax
= __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60ptrdiff_t&#62::__max / sizeof(_Tp);
40246748 8b 45 e8 mov -0x18(%rbp),%rax const size_t __allocmax = _Alloc_traits::max_size(__a);
= __gnu_<span class="namespc">cxx</span>::__numeric_traits&#60ptrdiff_t&#62::__max / sizeof(_Tp);
40247348 89 45 f0 mov %rax,-0x10(%rbp)
40247748 8d 55 f0 lea -0x10(%rbp),%rdx return (std::min)(__diffmax, __allocmax);
40248dc9 leaveq }
40248f90 nop
_ZNKSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE19_M_get_Tp_allocatorEv
const _Tp_alloc_type&
40249055 push %rbp _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
40249848 8b 45 f8 mov -0x8(%rbp),%rax { return this->_M_impl; }
40249c5d pop %rbp
_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv
/usr/include/c++/9/ext/new_allocator.h
pointer
address(reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
const_pointer
address(const_reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }
//\ NB:\ __n\ is\ permitted\ to\ be\ 0\.\ \ The\ C\ standard\ says\ nothing
//\ about\ what\ the\ return\ value\ is\ when\ __n\ ==\ 0\.
_GLIBCXX_NODISCARD pointer
40249e55 push %rbp allocate(size_type __n, const void* = static_cast<const void*>(0))
{
4024b248 8b 45 f8 mov -0x8(%rbp),%rax if (__n > this->max_size())
{
4024c584 c0 test %al,%al
4024c9e8 72 eb ff ff callq401040_ZSt17__throw_bad_allocv@plt std::__throw_bad_alloc();
#if __cpp_aligned_new
if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
{
std::align_val_t __al = std::align_val_t(alignof(_Tp));
return static_cast&#60_Tp*&#62(::operator new(__n * sizeof(_Tp), __al));
}
#endif
4024ce48 8b 45 f0 mov -0x10(%rbp),%rax return static_cast&#60_Tp*&#62(::operator new(__n * sizeof(_Tp)));
4024dec9 leaveq }
_ZSt12__relocate_aIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_SaIS5_EET0_T_S9_S8_RT1_
/usr/include/c++/9/bits/stl_uninitialized.h
template<typename _ForwardIterator, typename _Tp, typename _Allocator>
void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp, typename _Tp2>
inline void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, allocator<_Tp2>&)
{ std::uninitialized_fill(__first, __last, __x); }
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Allocator>
_ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Tp2>
inline _ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, allocator<_Tp2>&)
{ return std::uninitialized_fill_n(__first, __n, __x); }
//\ Extensions:\ __uninitialized_copy_move,\ __uninitialized_move_copy,
//\ __uninitialized_fill_move,\ __uninitialized_move_fill\.
//\ All\ of\ these\ algorithms\ take\ a\ user\-supplied\ allocator,\ which\ is\ used
//\ for\ construction\ and\ destruction\.
//\ __uninitialized_copy_move
//\ Copies\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ move\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_copy_move(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_copy
//\ Moves\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ copies\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_move_copy(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_fill_move
//\ Fills\ \[result,\ mid\)\ with\ x,\ and\ moves\ \[first,\ last\)\ into
//\ \ \[mid,\ mid\ \ \(last\ \-\ first\)\)\.
template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
typename _Allocator>
inline _ForwardIterator
__uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
const _Tp& __x, _InputIterator __first,
_InputIterator __last, _Allocator& __alloc)
{
std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
__try
{
return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_fill
//\ Moves\ \[first1,\ last1\)\ into\ \[first2,\ first2\ \ \(last1\ \-\ first1\)\),\ and
//\ \ fills\ \[first2\ \ \(last1\ \-\ first1\),\ last2\)\ with\ x\.
template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
typename _Allocator>
inline void
__uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
_ForwardIterator __first2,
_ForwardIterator __last2, const _Tp& __x,
_Allocator& __alloc)
{
_ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
__first2,
__alloc);
__try
{
std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
}
__catch(...)
{
std::_Destroy(__first2, __mid2, __alloc);
__throw_exception_again;
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Extensions:\ __uninitialized_default,\ __uninitialized_default_n,
//\ __uninitialized_default_a,\ __uninitialized_default_n_a\.
template<bool _TrivialValueType>
struct __uninitialized_default_1
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::fill(__first, __last, _ValueType());
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return std::fill_n(__first, __n, _ValueType());
}
};
//\ __uninitialized_default
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
std::__uninitialized_default_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
return __uninitialized_default_n_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default_n(__first, __n);
}
//\ __uninitialized_default_a
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\),\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Allocator>
void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp>
inline void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
allocator<_Tp>&)
{ std::__uninitialized_default(__first, __last); }
//\ __uninitialized_default_n_a
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_types\(s\),
//\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Size, typename _Allocator>
_ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline _ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
allocator<_Tp>&)
{ return std::__uninitialized_default_n(__first, __n); }
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_1
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{ return std::next(__first, __n); }
};
//\ __uninitialized_default_novalue
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default\-initialized
//\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::__uninitialized_default_novalue_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\-initialized\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_novalue_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return __uninitialized_default_novalue_n_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue_n(__first, __n);
}
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
_ForwardIterator
__uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline _ForwardIterator
__uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{ return std::uninitialized_copy(__first, __first + __n, __result); }
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return {__first, __cur};
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline pair<_RandomAccessIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{
auto __second_res = uninitialized_copy(__first, __first + __n, __result);
auto __first_res = std::next(__first, __n);
return {__first_res, __second_res};
}
/**
* @brief Copies the range [first,first+n) into result.
* @param __first An input iterator.
* @param __n The number of elements to copy.
* @param __result An output iterator.
* @return __result + __n
*
* Like copy_n(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{ return std::__uninitialized_copy_n(__first, __n, __result,
std::__iterator_category(__first)); }
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{
return
std::__uninitialized_copy_n_pair(__first, __n, __result,
std::__iterator_category(__first));
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
# define define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L
template <typename _ForwardIterator>
inline void
uninitialized_default_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
__uninitialized_default_novalue(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_default_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_novalue_n(__first, __count);
}
template <typename _ForwardIterator>
inline void
uninitialized_value_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
return __uninitialized_default(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_n(__first, __count);
}
template <typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_move(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
return std::uninitialized_copy
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
_GLIBCXX_MAKE_MOVE_ITERATOR(__last), __result);
}
template <typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
uninitialized_move_n(_InputIterator __first, _Size __count,
_ForwardIterator __result)
{
auto __res = std::__uninitialized_copy_n_pair
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
__count, __result);
return {__res.first.base(), __res.second};
}
#endif // //\ C17 //\ C17
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Up, typename _Allocator>
inline void
__relocate_object_a(_Tp* __dest, _Up* __orig, _Allocator& __alloc)
noexcept(noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::construct(__alloc,
__dest, std::move(*__orig)))
&& noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::destroy(
__alloc, std::__addressof(*__orig))))
{
typedef std::allocator_traits<_Allocator> __traits;
__traits::construct(__alloc, __dest, std::move(*__orig));
__traits::destroy(__alloc, std::__addressof(*__orig));
}
//\ This\ class\ may\ be\ specialized\ for\ specific\ types\.
//\ Also\ known\ as\ is_trivially_relocatable\.
template<typename _Tp, typename = void>
struct __is_bitwise_relocatable
: is_trivial<_Tp> { };
template <typename _Tp, typename _Up>
inline __enable_if_t&#60<span class="namespc">std</span>::__is_bitwise_relocatable&#60_Tp&#62::value, _Tp*&#62
__relocate_a_1(_Tp* __first, _Tp* __last,
_Tp* __result, allocator<_Up>&) noexcept
{
ptrdiff_t __count = __last - __first;
if (__count > 0)
__builtin_memmove(__result, __first, __count * sizeof(_Tp));
return __result + __count;
}
template <typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
inline _ForwardIterator
__relocate_a_1(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
noexcept(noexcept(std::__relocate_object_a(std::addressof(*__result),
std::addressof(*__first),
__alloc)))
{
typedef typename iterator_traits&#60_InputIterator&#62::value_type
_ValueType;
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType2;
static_assert(<span class="namespc">std</span>::is_same&#60_ValueType, _ValueType2&#62::value,
"relocation is only possible for values of the same type");
_ForwardIterator __cur = __result;
for (; __first != __last; ++__first, (void)++__cur)
std::__relocate_object_a(std::__addressof(*__cur),
std::__addressof(*__first), __alloc);
return __cur;
}
template <typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
inline _ForwardIterator
4024e055 push %rbp __relocate_a(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
noexcept(noexcept(__relocate_a_1(std::__niter_base(__first),
std::__niter_base(__last),
std::__niter_base(__result), __alloc)))
{
4024fb48 8b 45 d8 mov -0x28(%rbp),%rax return __relocate_a_1(std::__niter_base(__first),
std::__niter_base(__last),
std::__niter_base(__result), __alloc);
40253a48 83 c4 20 add $0x20,%rsp }
std::__niter_base(__last),
std::__niter_base(__result), __alloc);
40254390 nop
_ZNSt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ES6_
/usr/include/c++/9/bits/stl_iterator.h
template<typename _Iterator, typename _Container>
inline __normal_iterator<_Iterator, _Container>
operator+(typename __normal_iterator&#60_Iterator, _Container&#62::difference_type
__n, const __normal_iterator<_Iterator, _Container>& __i)
_GLIBCXX_NOEXCEPT
{ return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Iterator, typename _Container>
_Iterator
__niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
_GLIBCXX_NOEXCEPT_IF(<span class="namespc">std</span>::is_nothrow_copy_constructible&#60_Iterator&#62::value)
{ return __it.base(); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @addtogroup iterators
* @{
*/
//\ 24\.4\.3\ \ Move\ iterators
/**
* Class template move_iterator is an iterator adapter with the same
* behavior as the underlying iterator except that its dereference
* operator implicitly converts the value returned by the underlying
* iterator's dereference operator to an rvalue reference. Some
* generic algorithms can be called with move iterators to replace
* copying with moving.
*/
template<typename _Iterator>
class move_iterator
{
protected:
_Iterator _M_current;
typedef iterator_traits<_Iterator> __traits_type;
typedef typename __traits_type::reference __base_ref;
public:
typedef _Iterator iterator_type;
typedef typename __traits_type::iterator_category iterator_category;
typedef typename __traits_type::value_type value_type;
typedef typename __traits_type::difference_type difference_type;
//\ NB:\ DR\ 680\.
typedef _Iterator pointer;
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2106\.\ move_iterator\ wrapping\ iterators\ returning\ prvalues
typedef typename conditional&#60is_reference&#60__base_ref&#62::value,
typename remove_reference&#60__base_ref&#62::type&&,
__base_ref&#62::type reference;
_GLIBCXX17_CONSTEXPR
move_iterator()
: _M_current() { }
explicit _GLIBCXX17_CONSTEXPR
40254455 push %rbp move_iterator(iterator_type __i)
40255048 8b 45 f8 mov -0x8(%rbp),%rax : _M_current(__i) { }
40255b90 nop
_ZSt18uninitialized_copyISt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEES7_ET0_T_SA_S9_
/usr/include/c++/9/bits/stl_uninitialized.h
//\ Raw\ memory\ manipulators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_uninitialized.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_UNINITIALIZED_H
#define _STL_UNINITIALIZED_H _STL_UNINITIALIZED_H 1 _STL_UNINITIALIZED_H 1
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
#include <utility>
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<bool _TrivialValueTypes>
struct __uninitialized_copy
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
_ForwardIterator __cur = __result;
__try
{
for (; __first != __last; ++__first, (void)++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_copy<true>
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
__uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{ return std::copy(__first, __last, __result); }
};
/**
* @brief Copies the range [first,last) into result.
* @param __first An input iterator.
* @param __last An input iterator.
* @param __result An output iterator.
* @return __result + (__first - __last)
*
* Like copy(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
40255e55 push %rbp uninitialized_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
typedef typename iterator_traits&#60_InputIterator&#62::value_type
_ValueType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType2;
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
const bool __assignable = true;
#else
//\ trivial\ types\ can\ have\ deleted\ assignment
typedef typename iterator_traits&#60_InputIterator&#62::reference _RefType1;
typedef typename iterator_traits&#60_ForwardIterator&#62::reference _RefType2;
402572c6 45 ff 01 movb $0x1,-0x1(%rbp) const bool __assignable = is_assignable&#60_RefType2, _RefType1&#62::value;
#endif
return std::__uninitialized_copy<__is_trivial(_ValueType1)
&& __is_trivial(_ValueType2)
&& __assignable&#62::
40257648 8b 55 d8 mov -0x28(%rbp),%rdx __uninit_copy(__first, __last, __result);
40258dc9 leaveq }
_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8max_sizeERKS6_
/usr/include/c++/9/bits/alloc_traits.h
/**
* @brief The maximum supported allocation size
* @param __a An allocator.
* @return @c __a.max_size()
*/
static size_type
40258f55 push %rbp max_size(const allocator_type& __a) noexcept
40259b48 8b 45 f8 mov -0x8(%rbp),%rax { return __a.max_size(); }
4025a7c9 leaveq
_ZSt3minImERKT_S2_S2_
/usr/include/c++/9/bits/stl_algobase.h
//\ Core\ algorithmic\ facilities\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996-1998
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_algobase.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{algorithm}
*/
#ifndef _STL_ALGOBASE_H
#define _STL_ALGOBASE_H _STL_ALGOBASE_H 1 _STL_ALGOBASE_H 1
#include <bits/c++config.h>
#include <bits/functexcept.h>
#include <bits/cpp_type_traits.h>
#include <ext/type_traits.h>
#include <ext/numeric_traits.h>
#include <bits/stl_pair.h>
#include <bits/stl_iterator_base_types.h>
#include <bits/stl_iterator_base_funcs.h>
#include <bits/stl_iterator.h>
#include <bits/concept_check.h>
#include <debug/debug.h>
#include <bits/move.h> <bits/move.h> // <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap <bits/move.h> // For <bits/move.h> //\ For\ std::swap <bits/move.h> //\ For\ std::swap
#include <bits/predefined_ops.h>
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
# include include <type_traits> &#60type_traits&#62
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
// See http://gcc\.gnu\.org/ml/libstdc/2004\-08/msg00167\.html:\ in\ a
//\ nutshell,\ we\ are\ partially\ implementing\ the\ resolution\ of\ DR\ 187,
//\ when\ it's\ safe,\ i\.e\.,\ the\ value_types\ are\ equal\.
template<bool _BoolType>
struct __iter_swap
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
typedef typename iterator_traits&#60_ForwardIterator1&#62::value_type
_ValueType1;
_ValueType1 __tmp = *__a;
*__a = *__b;
*__b = __tmp;
}
};
template<>
struct __iter_swap<true>
{
template<typename _ForwardIterator1, typename _ForwardIterator2>
static void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
swap(*__a, *__b);
}
};
#endif
/**
* @brief Swaps the contents of two iterators.
* @ingroup mutating_algorithms
* @param __a An iterator.
* @param __b Another iterator.
* @return Nothing.
*
* This function swaps the values pointed to by two iterators, not the
* iterators themselves.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
inline void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator1>)
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator2>)
#if __cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
typedef typename iterator_traits&#60_ForwardIterator1&#62::value_type
_ValueType1;
typedef typename iterator_traits&#60_ForwardIterator2&#62::value_type
_ValueType2;
__glibcxx_function_requires(_ConvertibleConcept<_ValueType1,
_ValueType2>)
__glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
_ValueType1>)
typedef typename iterator_traits&#60_ForwardIterator1&#62::reference
_ReferenceType1;
typedef typename iterator_traits&#60_ForwardIterator2&#62::reference
_ReferenceType2;
<span class="namespc">std</span>::__iter_swap&#60__are_same&#60_ValueType1, _ValueType2&#62::__value
&& __are_same&#60_ValueType1&, _ReferenceType1&#62::__value
<span class="namespc"></span> <span class="namespc"></span>&<span class="namespc"></span>&<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>2<span class="namespc"></span>&<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>R<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>2<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
iter_swap(__a, __b);
#else
swap(*__a, *__b);
#endif
}
/**
* @brief Swap the elements of two sequences.
* @ingroup mutating_algorithms
* @param __first1 A forward iterator.
* @param __last1 A forward iterator.
* @param __first2 A forward iterator.
* @return An iterator equal to @p first2+(last1-first1).
*
* Swaps each element in the range @p [first1,last1) with the
* corresponding element in the range @p [first2,(last1-first1)).
* The ranges must not overlap.
*/
template<typename _ForwardIterator1, typename _ForwardIterator2>
_ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2)
{
//\ concept\ requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator1>)
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator2>)
__glibcxx_requires_valid_range(__first1, __last1);
for (; __first1 != __last1; ++__first1, (void)++__first2)
std::iter_swap(__first1, __first2);
return __first2;
}
/**
* @brief This does what you think it does.
* @ingroup sorting_algorithms
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @return The lesser of the parameters.
*
* This is the simple classic generic implementation. It will work on
* temporary expressions, since they are only evaluated once, unlike a
* preprocessor macro.
*/
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
4025a955 push %rbp min(const _Tp& __a, const _Tp& __b)
{
//\ concept\ requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return\ __b\ &\#60\ __a\ \?\ __b\ :\ __a;
4025b548 8b 45 f0 mov -0x10(%rbp),%rax if (__b < __a)
{
//\ concept\ requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return\ __b\ &\#60\ __a\ \?\ __b\ :\ __a;
4025c348 39 c2 cmp %rax,%rdx
4025c848 8b 45 f0 mov -0x10(%rbp),%rax return __b;
4025ce48 8b 45 f8 mov -0x8(%rbp),%rax return __a;
4025d25d pop %rbp }
_ZNK9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8max_sizeEv
/usr/include/c++/9/ext/new_allocator.h
size_type
4025d455 push %rbp max_size() const _GLIBCXX_USE_NOEXCEPT
{
#if __PTRDIFF_MAX__ __PTRDIFF_MAX__ < __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __PTRDIFF_MAX__ < __SIZE_MAX__ __PTRDIFF_MAX__ < __SIZE_MAX__
4025dc48 b8 ff ff ff ff ff movabs $0x3ffffffffffffff,%rax return size_t(__PTRDIFF_MAX__) / sizeof(_Tp);
#else
return size_t(-1) / sizeof(_Tp);
#endif
4025e65d pop %rbp }
_ZSt12__niter_baseIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEET_S7_
/usr/include/c++/9/bits/stl_algobase.h
/**
* @brief This does what you think it does.
* @ingroup sorting_algorithms
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @param __comp A @link comparison_functors comparison functor@endlink.
* @return The lesser of the parameters.
*
* This will work on temporary expressions, since they are only evaluated
* once, unlike a preprocessor macro.
*/
template<typename _Tp, typename _Compare>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
min(const _Tp& __a, const _Tp& __b, _Compare __comp)
{
//return\ __comp\(__b,\ __a\)\ \?\ __b\ :\ __a;
if (__comp(__b, __a))
return __b;
return __a;
}
/**
* @brief This does what you think it does.
* @ingroup sorting_algorithms
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @param __comp A @link comparison_functors comparison functor@endlink.
* @return The greater of the parameters.
*
* This will work on temporary expressions, since they are only evaluated
* once, unlike a preprocessor macro.
*/
template<typename _Tp, typename _Compare>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b, _Compare __comp)
{
//return\ __comp\(__a,\ __b\)\ \?\ __b\ :\ __a;
if (__comp(__a, __b))
return __b;
return __a;
}
//\ Fallback\ implementation\ of\ the\ function\ in\ bits/stl_iterator\.h\ used\ to
//\ remove\ the\ __normal_iterator\ wrapper\.\ See\ copy,\ fill,\ \.\.\.
template<typename _Iterator>
inline _Iterator
4025e855 push %rbp __niter_base(_Iterator __it)
_GLIBCXX_NOEXCEPT_IF(<span class="namespc">std</span>::is_nothrow_copy_constructible&#60_Iterator&#62::value)
4025f048 8b 45 f8 mov -0x8(%rbp),%rax { return __it; }
_GLIBCXX_NOEXCEPT_IF(<span class="namespc">std</span>::is_nothrow_copy_constructible&#60_Iterator&#62::value)
4025f45d pop %rbp
_ZSt14__relocate_a_1IPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_SaIS5_EET0_T_S9_S8_RT1_
/usr/include/c++/9/bits/stl_uninitialized.h
template<typename _ForwardIterator, typename _Tp, typename _Allocator>
void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp, typename _Tp2>
inline void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, allocator<_Tp2>&)
{ std::uninitialized_fill(__first, __last, __x); }
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Allocator>
_ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Tp2>
inline _ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, allocator<_Tp2>&)
{ return std::uninitialized_fill_n(__first, __n, __x); }
//\ Extensions:\ __uninitialized_copy_move,\ __uninitialized_move_copy,
//\ __uninitialized_fill_move,\ __uninitialized_move_fill\.
//\ All\ of\ these\ algorithms\ take\ a\ user\-supplied\ allocator,\ which\ is\ used
//\ for\ construction\ and\ destruction\.
//\ __uninitialized_copy_move
//\ Copies\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ move\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_copy_move(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_copy
//\ Moves\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ copies\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_move_copy(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_fill_move
//\ Fills\ \[result,\ mid\)\ with\ x,\ and\ moves\ \[first,\ last\)\ into
//\ \ \[mid,\ mid\ \ \(last\ \-\ first\)\)\.
template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
typename _Allocator>
inline _ForwardIterator
__uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
const _Tp& __x, _InputIterator __first,
_InputIterator __last, _Allocator& __alloc)
{
std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
__try
{
return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_fill
//\ Moves\ \[first1,\ last1\)\ into\ \[first2,\ first2\ \ \(last1\ \-\ first1\)\),\ and
//\ \ fills\ \[first2\ \ \(last1\ \-\ first1\),\ last2\)\ with\ x\.
template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
typename _Allocator>
inline void
__uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
_ForwardIterator __first2,
_ForwardIterator __last2, const _Tp& __x,
_Allocator& __alloc)
{
_ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
__first2,
__alloc);
__try
{
std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
}
__catch(...)
{
std::_Destroy(__first2, __mid2, __alloc);
__throw_exception_again;
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Extensions:\ __uninitialized_default,\ __uninitialized_default_n,
//\ __uninitialized_default_a,\ __uninitialized_default_n_a\.
template<bool _TrivialValueType>
struct __uninitialized_default_1
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::fill(__first, __last, _ValueType());
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return std::fill_n(__first, __n, _ValueType());
}
};
//\ __uninitialized_default
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
std::__uninitialized_default_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
return __uninitialized_default_n_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default_n(__first, __n);
}
//\ __uninitialized_default_a
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\),\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Allocator>
void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp>
inline void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
allocator<_Tp>&)
{ std::__uninitialized_default(__first, __last); }
//\ __uninitialized_default_n_a
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_types\(s\),
//\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Size, typename _Allocator>
_ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline _ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
allocator<_Tp>&)
{ return std::__uninitialized_default_n(__first, __n); }
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_1
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{ return std::next(__first, __n); }
};
//\ __uninitialized_default_novalue
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default\-initialized
//\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::__uninitialized_default_novalue_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\-initialized\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_novalue_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return __uninitialized_default_novalue_n_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue_n(__first, __n);
}
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
_ForwardIterator
__uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline _ForwardIterator
__uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{ return std::uninitialized_copy(__first, __first + __n, __result); }
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return {__first, __cur};
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline pair<_RandomAccessIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{
auto __second_res = uninitialized_copy(__first, __first + __n, __result);
auto __first_res = std::next(__first, __n);
return {__first_res, __second_res};
}
/**
* @brief Copies the range [first,first+n) into result.
* @param __first An input iterator.
* @param __n The number of elements to copy.
* @param __result An output iterator.
* @return __result + __n
*
* Like copy_n(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{ return std::__uninitialized_copy_n(__first, __n, __result,
std::__iterator_category(__first)); }
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{
return
std::__uninitialized_copy_n_pair(__first, __n, __result,
std::__iterator_category(__first));
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
# define define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L
template <typename _ForwardIterator>
inline void
uninitialized_default_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
__uninitialized_default_novalue(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_default_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_novalue_n(__first, __count);
}
template <typename _ForwardIterator>
inline void
uninitialized_value_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
return __uninitialized_default(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_n(__first, __count);
}
template <typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_move(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
return std::uninitialized_copy
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
_GLIBCXX_MAKE_MOVE_ITERATOR(__last), __result);
}
template <typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
uninitialized_move_n(_InputIterator __first, _Size __count,
_ForwardIterator __result)
{
auto __res = std::__uninitialized_copy_n_pair
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
__count, __result);
return {__res.first.base(), __res.second};
}
#endif // //\ C17 //\ C17
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Up, typename _Allocator>
inline void
__relocate_object_a(_Tp* __dest, _Up* __orig, _Allocator& __alloc)
noexcept(noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::construct(__alloc,
__dest, std::move(*__orig)))
&& noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::destroy(
__alloc, std::__addressof(*__orig))))
{
typedef std::allocator_traits<_Allocator> __traits;
__traits::construct(__alloc, __dest, std::move(*__orig));
__traits::destroy(__alloc, std::__addressof(*__orig));
}
//\ This\ class\ may\ be\ specialized\ for\ specific\ types\.
//\ Also\ known\ as\ is_trivially_relocatable\.
template<typename _Tp, typename = void>
struct __is_bitwise_relocatable
: is_trivial<_Tp> { };
template <typename _Tp, typename _Up>
inline __enable_if_t&#60<span class="namespc">std</span>::__is_bitwise_relocatable&#60_Tp&#62::value, _Tp*&#62
__relocate_a_1(_Tp* __first, _Tp* __last,
_Tp* __result, allocator<_Up>&) noexcept
{
ptrdiff_t __count = __last - __first;
if (__count > 0)
__builtin_memmove(__result, __first, __count * sizeof(_Tp));
return __result + __count;
}
template <typename _InputIterator, typename _ForwardIterator,
typename _Allocator>
inline _ForwardIterator
4025f655 push %rbp __relocate_a_1(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result, _Allocator& __alloc)
noexcept(noexcept(std::__relocate_object_a(std::addressof(*__result),
std::addressof(*__first),
__alloc)))
{
typedef typename iterator_traits&#60_InputIterator&#62::value_type
_ValueType;
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType2;
static_assert(<span class="namespc">std</span>::is_same&#60_ValueType, _ValueType2&#62::value,
"relocation is only possible for values of the same type");
40260f48 8b 45 c8 mov -0x38(%rbp),%rax _ForwardIterator __cur = __result;
40261748 8b 45 d8 mov -0x28(%rbp),%rax for (; __first != __last; ++__first, (void)++__cur)
40262148 8b 45 d8 mov -0x28(%rbp),%rax std::__relocate_object_a(std::__addressof(*__cur),
40265148 83 45 d8 20 addq $0x20,-0x28(%rbp) for (; __first != __last; ++__first, (void)++__cur)
std::__addressof(*__first), __alloc);
40265d48 8b 45 e8 mov -0x18(%rbp),%rax return __cur;
40266148 83 c4 38 add $0x38,%rsp }
_ZNSt20__uninitialized_copyILb0EE13__uninit_copyISt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEES9_EET0_T_SC_SB_
//\ Raw\ memory\ manipulators\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_uninitialized.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_UNINITIALIZED_H
#define _STL_UNINITIALIZED_H _STL_UNINITIALIZED_H 1 _STL_UNINITIALIZED_H 1
#if __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
#include <utility>
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include <type_traits>
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<bool _TrivialValueTypes>
struct __uninitialized_copy
{
template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator
40266855 push %rbp __uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
40267d48 8b 45 c8 mov -0x38(%rbp),%rax _ForwardIterator __cur = __result;
__try
{
40268548 8d 55 d0 lea -0x30(%rbp),%rdx for (; __first != __last; ++__first, (void)++__cur)
40269c48 8d 45 d8 lea -0x28(%rbp),%rax std::_Construct(std::__addressof(*__cur), *__first);
4026ab48 8b 45 e8 mov -0x18(%rbp),%rax
__try
{
4026c248 8d 45 d8 lea -0x28(%rbp),%rax for (; __first != __last; ++__first, (void)++__cur)
__try
{
4026ce48 83 45 e8 20 addq $0x20,-0x18(%rbp)
4026d548 8b 45 e8 mov -0x18(%rbp),%rax return __cur;
}
4026db48 89 c7 mov %rax,%rdi __catch(...)
{
4026e348 8b 55 e8 mov -0x18(%rbp),%rdx std::_Destroy(__result, __cur);
4026f6e8 55 ea ff ff callq401150__cxa_rethrow@plt __throw_exception_again;
}
4026fee8 7d ea ff ff callq401180__cxa_end_catch@plt __catch(...)
}
40270e48 83 c4 38 add $0x38,%rsp }
_ZSt19__relocate_object_aINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_SaIS5_EEvPT_PT0_RT1_
template<typename _ForwardIterator, typename _Tp, typename _Allocator>
void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp, typename _Tp2>
inline void
__uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __x, allocator<_Tp2>&)
{ std::uninitialized_fill(__first, __last, __x); }
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Allocator>
_ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Tp2>
inline _ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, allocator<_Tp2>&)
{ return std::uninitialized_fill_n(__first, __n, __x); }
//\ Extensions:\ __uninitialized_copy_move,\ __uninitialized_move_copy,
//\ __uninitialized_fill_move,\ __uninitialized_move_fill\.
//\ All\ of\ these\ algorithms\ take\ a\ user\-supplied\ allocator,\ which\ is\ used
//\ for\ construction\ and\ destruction\.
//\ __uninitialized_copy_move
//\ Copies\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ move\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_copy_move(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_copy
//\ Moves\ \[first1,\ last1\)\ into\ \[result,\ result\ \ \(last1\ \-\ first1\)\),\ and
//\ \ copies\ \[first2,\ last2\)\ into
//\ \ \[result,\ result\ \ \(last1\ \-\ first1\)\ \ \(last2\ \-\ first2\)\)\.
template<typename _InputIterator1, typename _InputIterator2,
typename _ForwardIterator, typename _Allocator>
inline _ForwardIterator
__uninitialized_move_copy(_InputIterator1 __first1,
_InputIterator1 __last1,
_InputIterator2 __first2,
_InputIterator2 __last2,
_ForwardIterator __result,
_Allocator& __alloc)
{
_ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
__result,
__alloc);
__try
{
return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_fill_move
//\ Fills\ \[result,\ mid\)\ with\ x,\ and\ moves\ \[first,\ last\)\ into
//\ \ \[mid,\ mid\ \ \(last\ \-\ first\)\)\.
template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
typename _Allocator>
inline _ForwardIterator
__uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
const _Tp& __x, _InputIterator __first,
_InputIterator __last, _Allocator& __alloc)
{
std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
__try
{
return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
}
__catch(...)
{
std::_Destroy(__result, __mid, __alloc);
__throw_exception_again;
}
}
//\ __uninitialized_move_fill
//\ Moves\ \[first1,\ last1\)\ into\ \[first2,\ first2\ \ \(last1\ \-\ first1\)\),\ and
//\ \ fills\ \[first2\ \ \(last1\ \-\ first1\),\ last2\)\ with\ x\.
template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
typename _Allocator>
inline void
__uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
_ForwardIterator __first2,
_ForwardIterator __last2, const _Tp& __x,
_Allocator& __alloc)
{
_ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
__first2,
__alloc);
__try
{
std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
}
__catch(...)
{
std::_Destroy(__first2, __mid2, __alloc);
__throw_exception_again;
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ Extensions:\ __uninitialized_default,\ __uninitialized_default_n,
//\ __uninitialized_default_a,\ __uninitialized_default_n_a\.
template<bool _TrivialValueType>
struct __uninitialized_default_1
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::fill(__first, __last, _ValueType());
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return std::fill_n(__first, __n, _ValueType());
}
};
//\ __uninitialized_default
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
std::__uninitialized_default_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
//\ trivial\ types\ can\ have\ deleted\ assignment
const bool __assignable = is_copy_assignable&#60_ValueType&#62::value;
return __uninitialized_default_n_1<__is_trivial(_ValueType)
&& __assignable&#62::
__uninit_default_n(__first, __n);
}
//\ __uninitialized_default_a
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default
//\ constructed\ value_types\(s\),\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Allocator>
void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __cur != __last; ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp>
inline void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
allocator<_Tp>&)
{ std::__uninitialized_default(__first, __last); }
//\ __uninitialized_default_n_a
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\ constructed\ value_types\(s\),
//\ constructed\ with\ the\ allocator\ alloc\.
template<typename _ForwardIterator, typename _Size, typename _Allocator>
_ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, (void) ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline _ForwardIterator
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
allocator<_Tp>&)
{ return std::__uninitialized_default_n(__first, __n); }
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_1
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_novalue_n_1
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, (void) ++__cur)
std::_Construct_novalue(std::__addressof(*__cur));
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_novalue_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static _ForwardIterator
__uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
{ return std::next(__first, __n); }
};
//\ __uninitialized_default_novalue
//\ Fills\ \[first,\ last\)\ with\ std::distance\(first,\ last\)\ default\-initialized
//\ value_types\(s\)\.
template<typename _ForwardIterator>
inline void
__uninitialized_default_novalue(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
std::__uninitialized_default_novalue_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue(__first, __last);
}
//\ __uninitialized_default_n
//\ Fills\ \[first,\ first\ \ n\)\ with\ n\ default\-initialized\ value_type\(s\)\.
template<typename _ForwardIterator, typename _Size>
inline _ForwardIterator
__uninitialized_default_novalue_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits&#60_ForwardIterator&#62::value_type
_ValueType;
return __uninitialized_default_novalue_n_1<
<span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>i<span class="namespc"></span>v<span class="namespc"></span>i<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>y<span class="namespc"></span>_<span class="namespc"></span>d<span class="namespc"></span>e<span class="namespc"></span>f<span class="namespc"></span>a<span class="namespc"></span>u<span class="namespc"></span>l<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span>r<span class="namespc"></span>u<span class="namespc"></span>c<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>0<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>&<span class="namespc"></span>#<span class="namespc"></span>6<span class="namespc"></span>2<span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span> <span class="namespc"></span>
__uninit_default_novalue_n(__first, __n);
}
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
_ForwardIterator
__uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return __cur;
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline _ForwardIterator
__uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{ return std::uninitialized_copy(__first, __first + __n, __result); }
template<typename _InputIterator, typename _Size,
typename _ForwardIterator>
pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result, input_iterator_tag)
{
_ForwardIterator __cur = __result;
__try
{
for (; __n > 0; --__n, (void) ++__first, ++__cur)
std::_Construct(std::__addressof(*__cur), *__first);
return {__first, __cur};
}
__catch(...)
{
std::_Destroy(__result, __cur);
__throw_exception_again;
}
}
template<typename _RandomAccessIterator, typename _Size,
typename _ForwardIterator>
inline pair<_RandomAccessIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_RandomAccessIterator __first, _Size __n,
_ForwardIterator __result,
random_access_iterator_tag)
{
auto __second_res = uninitialized_copy(__first, __first + __n, __result);
auto __first_res = std::next(__first, __n);
return {__first_res, __second_res};
}
/**
* @brief Copies the range [first,first+n) into result.
* @param __first An input iterator.
* @param __n The number of elements to copy.
* @param __result An output iterator.
* @return __result + __n
*
* Like copy_n(), but does not require an initialized output range.
*/
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_copy_n(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{ return std::__uninitialized_copy_n(__first, __n, __result,
std::__iterator_category(__first)); }
template<typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
__uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
_ForwardIterator __result)
{
return
std::__uninitialized_copy_n_pair(__first, __n, __result,
std::__iterator_category(__first));
}
#endif
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
# define define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms define __cpp_lib_raw_memory_algorithms 201606L define __cpp_lib_raw_memory_algorithms 201606L
template <typename _ForwardIterator>
inline void
uninitialized_default_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
__uninitialized_default_novalue(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_default_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_novalue_n(__first, __count);
}
template <typename _ForwardIterator>
inline void
uninitialized_value_construct(_ForwardIterator __first,
_ForwardIterator __last)
{
return __uninitialized_default(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
{
return __uninitialized_default_n(__first, __count);
}
template <typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator
uninitialized_move(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result)
{
return std::uninitialized_copy
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
_GLIBCXX_MAKE_MOVE_ITERATOR(__last), __result);
}
template <typename _InputIterator, typename _Size, typename _ForwardIterator>
inline pair<_InputIterator, _ForwardIterator>
uninitialized_move_n(_InputIterator __first, _Size __count,
_ForwardIterator __result)
{
auto __res = std::__uninitialized_copy_n_pair
(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
__count, __result);
return {__res.first.base(), __res.second};
}
#endif // //\ C17 //\ C17
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Up, typename _Allocator>
inline void
40271555 push %rbp __relocate_object_a(_Tp* __dest, _Up* __orig, _Allocator& __alloc)
noexcept(noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::construct(__alloc,
__dest, std::move(*__orig)))
&& noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::destroy(
__alloc, std::__addressof(*__orig))))
{
typedef std::allocator_traits<_Allocator> __traits;
40272948 8b 45 f0 mov -0x10(%rbp),%rax __traits::construct(__alloc, __dest, std::move(*__orig));
noexcept(noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::construct(__alloc,
__dest, std::move(*__orig)))
&& noexcept(<span class="namespc">std</span>::allocator_traits&#60_Allocator&#62::destroy(
__alloc, std::__addressof(*__orig))))
{
typedef std::allocator_traits<_Allocator> __traits;
40273848 8b 4d f8 mov -0x8(%rbp),%rcx
40274b48 8b 45 f0 mov -0x10(%rbp),%rax __traits::destroy(__alloc, std::__addressof(*__orig));
40276990 nop }
_ZStneIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEbRKSt13move_iteratorIT_ESB_
/usr/include/c++/9/bits/stl_iterator.h
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR reference
operator*() const
{ return static_cast<reference>(*_M_current); }
_GLIBCXX17_CONSTEXPR pointer
operator->() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR move_iterator&
operator++()
{
++_M_current;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator++(int)
{
move_iterator __tmp = *this;
++_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator&
operator--()
{
--_M_current;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator--(int)
{
move_iterator __tmp = *this;
--_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator+(difference_type __n) const
{ return move_iterator(_M_current + __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator+=(difference_type __n)
{
_M_current += __n;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator-(difference_type __n) const
{ return move_iterator(_M_current - __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator-=(difference_type __n)
{
_M_current -= __n;
return *this;
}
_GLIBCXX17_CONSTEXPR reference
operator[](difference_type __n) const
{ return std::move(_M_current[__n]); }
};
//\ Note:\ See\ __normal_iterator\ operators\ note\ from\ Gaby\ to\ understand
//\ why\ there\ are\ always\ 2\ versions\ for\ most\ of\ the\ move_iterator
//\ operators\.
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return __x.base() == __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
{ return __x.base() == __y.base(); }
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator!=(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return !(__x == __y); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
40276c55 push %rbp operator!=(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
40277c48 8b 55 f0 mov -0x10(%rbp),%rdx { return !(__x == __y); }
const move_iterator<_Iterator>& __y)
40278f83 f0 01 xor $0x1,%eax
const move_iterator<_Iterator>& __y)
402792c9 leaveq
_ZNSt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEppEv
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR reference
operator*() const
{ return static_cast<reference>(*_M_current); }
_GLIBCXX17_CONSTEXPR pointer
operator->() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR move_iterator&
40279455 push %rbp operator++()
{
40279c48 8b 45 f8 mov -0x8(%rbp),%rax ++_M_current;
{
4027a348 8d 50 20 lea (%rax),%rdx
4027ae48 8b 45 f8 mov -0x8(%rbp),%rax return *this;
4027b25d pop %rbp }
_ZNKSt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEdeEv
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return _M_current; }
_GLIBCXX17_CONSTEXPR reference
4027b455 push %rbp operator*() const
4027bc48 8b 45 f8 mov -0x8(%rbp),%rax { return static_cast<reference>(*_M_current); }
4027c35d pop %rbp
_ZSt10_ConstructINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS5_EEvPT_DpOT0_
/usr/include/c++/9/bits/stl_construct.h
//\ nonstandard\ construct\ and\ destroy\ functions\ \-\*\-\ C\ \-\*\-
//\ Copyright\ \(C\)\ 2001\-2019\ Free\ Software\ Foundation,\ Inc\.
//
//\ This\ file\ is\ part\ of\ the\ GNU\ ISO\ C\ Library\.\ \ This\ library\ is\ free
//\ software;\ you\ can\ redistribute\ it\ and/or\ modify\ it\ under\ the
//\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by\ the
//\ Free\ Software\ Foundation;\ either\ version\ 3,\ or\ \(at\ your\ option\)
//\ any\ later\ version\.
//\ This\ library\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,
//\ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of
//\ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE\.\ \ See\ the
//\ GNU\ General\ Public\ License\ for\ more\ details\.
//\ Under\ Section\ 7\ of\ GPL\ version\ 3,\ you\ are\ granted\ additional
//\ permissions\ described\ in\ the\ GCC\ Runtime\ Library\ Exception,\ version
//\ 3\.1,\ as\ published\ by\ the\ Free\ Software\ Foundation\.
//\ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License\ and
//\ a\ copy\ of\ the\ GCC\ Runtime\ Library\ Exception\ along\ with\ this\ program;
//\ see\ the\ files\ COPYING3\ and\ COPYING\.RUNTIME\ respectively\.\ \ If\ not,\ see
// <http://www\.gnu\.org/licenses/&\#62\.
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/** @file bits/stl_construct.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{memory}
*/
#ifndef _STL_CONSTRUCT_H
#define _STL_CONSTRUCT_H _STL_CONSTRUCT_H 1 _STL_CONSTRUCT_H 1
#include <new>
#include <bits/move.h>
#include <ext/alloc_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
*/
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _T1, typename... _Args>
inline void
4027c555 push %rbp _Construct(_T1* __p, _Args&&... __args)
4027d648 8b 45 e0 mov -0x20(%rbp),%rax { ::new(static_cast&#60void*&#62(__p)) _T1(std::forward&#60_Args&#62(__args)...); }
4027e548 8b 45 e8 mov -0x18(%rbp),%rax
4027e948 89 c6 mov %rax,%rsi
40280190 nop
_ZSteqIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEbRKSt13move_iteratorIT_ESB_
/usr/include/c++/9/bits/stl_iterator.h
_GLIBCXX17_CONSTEXPR move_iterator
operator++(int)
{
move_iterator __tmp = *this;
++_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator&
operator--()
{
--_M_current;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator--(int)
{
move_iterator __tmp = *this;
--_M_current;
return __tmp;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator+(difference_type __n) const
{ return move_iterator(_M_current + __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator+=(difference_type __n)
{
_M_current += __n;
return *this;
}
_GLIBCXX17_CONSTEXPR move_iterator
operator-(difference_type __n) const
{ return move_iterator(_M_current - __n); }
_GLIBCXX17_CONSTEXPR move_iterator&
operator-=(difference_type __n)
{
_M_current -= __n;
return *this;
}
_GLIBCXX17_CONSTEXPR reference
operator[](difference_type __n) const
{ return std::move(_M_current[__n]); }
};
//\ Note:\ See\ __normal_iterator\ operators\ note\ from\ Gaby\ to\ understand
//\ why\ there\ are\ always\ 2\ versions\ for\ most\ of\ the\ move_iterator
//\ operators\.
template<typename _IteratorL, typename _IteratorR>
inline _GLIBCXX17_CONSTEXPR bool
operator==(const move_iterator<_IteratorL>& __x,
const move_iterator<_IteratorR>& __y)
{ return __x.base() == __y.base(); }
template<typename _Iterator>
inline _GLIBCXX17_CONSTEXPR bool
40280955 push %rbp operator==(const move_iterator<_Iterator>& __x,
const move_iterator<_Iterator>& __y)
40281a48 8b 45 e8 mov -0x18(%rbp),%rax { return __x.base() == __y.base(); }
const move_iterator<_Iterator>& __y)
40283548 39 c3 cmp %rax,%rbx
const move_iterator<_Iterator>& __y)
40283b48 83 c4 18 add $0x18,%rsp
_ZNKSt13move_iteratorIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4baseEv
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
_GLIBCXX17_CONSTEXPR iterator_type
40284255 push %rbp base() const
40284a48 8b 45 f8 mov -0x8(%rbp),%rax { return _M_current; }
4028515d pop %rbp
40285366 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
/usr/include/c++/9/iostream
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif /* /* _GLIBCXX_IOSTREAM /* _GLIBCXX_IOSTREAM */ /* _GLIBCXX_IOSTREAM */ /* _GLIBCXX_IOSTREAM /* _GLIBCXX_IOSTREAM */ /* _GLIBCXX_IOSTREAM */
/usr/include/c++/9/new
_GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
//\ Default\ placement\ versions\ of\ operator\ delete\.
inline void operator delete (void*, void*) _GLIBCXX_USE_NOEXCEPT { }
inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { }
//@\}
} //\ extern\ "C"
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
#ifdef _GLIBCXX_HAVE_BUILTIN_LAUNDER
namespace std
{
#define __cpp_lib_launder __cpp_lib_launder 201606 __cpp_lib_launder 201606
///\ Pointer\ optimization\ barrier\ \[ptr\.launder\]
template<typename _Tp>
[[nodiscard]] constexpr _Tp*
launder(_Tp* __p) noexcept
{ return __builtin_launder(__p); }
//\ The\ program\ is\ ill\-formed\ if\ T\ is\ a\ function\ type\ or
//\ \(possibly\ cv\-qualified\)\ void\.
template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
void launder(_Ret (*)(_Args...) _GLIBCXX_NOEXCEPT_QUAL) = delete;
template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
void launder(_Ret (*)(_Args......) _GLIBCXX_NOEXCEPT_QUAL) = delete;
void launder(void*) = delete;
void launder(const void*) = delete;
void launder(volatile void*) = delete;
void launder(const volatile void*) = delete;
}
#endif // //\ _GLIBCXX_HAVE_BUILTIN_LAUNDER //\ _GLIBCXX_HAVE_BUILTIN_LAUNDER
#endif // //\ C17 //\ C17
__cplusplus > __cplusplus > 201703L #if__cplusplus > __cplusplus > 201703L __cplusplus > __cplusplus > 201703L __cplusplus __cplusplus > __cplusplus > 201703L __cplusplus > 201703L __cplusplus > __cplusplus > 201703L __cplusplus > __cplusplus > 201703L __cplusplus > 201703L
namespace std
{
struct destroying_delete_t
{
explicit destroying_delete_t() = default;
};
inline constexpr destroying_delete_t destroying_delete{};
}
//\ Only\ define\ the\ feature\ test\ macro\ if\ the\ compiler\ supports\ the\ feature:
#if __cpp_impl_destroying_delete
# define define __cpp_lib_destroying_delete define __cpp_lib_destroying_delete 201806L define __cpp_lib_destroying_delete 201806L define __cpp_lib_destroying_delete define __cpp_lib_destroying_delete 201806L define __cpp_lib_destroying_delete 201806L
#endif
#endif // //\ C20 //\ C20
#pragma GCC GCC visibility GCC visibility pop GCC visibility pop GCC visibility GCC visibility pop GCC visibility pop
#endif
/usr/include/c++/9/bits/char_traits.h
static _GLIBCXX17_CONSTEXPR const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
if (__n == 0)
return 0;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__builtin_constant_p(__n)
&& __builtin_constant_p(__a)
&& __constant_char_array_p(__s, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::find(__s, __n, __a);
#endif
return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n));
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return static_cast(__builtin_memmove(__s1, __s2, __n));
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return static_cast(__builtin_memcpy(__s1, __s2, __n));
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
if (__n == 0)
return __s;
return static_cast(__builtin_memset(__s, __a, __n));
}
static _GLIBCXX_CONSTEXPR char_type
to_char_type(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return static_cast(__c); }
//\ To\ keep\ both\ the\ byte\ 0xff\ and\ the\ eof\ symbol\ 0xffffffff
//\ from\ ending\ up\ as\ 0xffffffff\.
static _GLIBCXX_CONSTEXPR int_type
to_int_type(const char_type& __c) _GLIBCXX_NOEXCEPT
{ return static_cast(static_cast<unsigned char>(__c)); }
static _GLIBCXX_CONSTEXPR bool
eq_int_type(const int_type& __c1, const int_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR int_type
eof() _GLIBCXX_NOEXCEPT
{ return static_cast(_GLIBCXX_STDIO_EOF); }
static _GLIBCXX_CONSTEXPR int_type
not_eof(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return (__c == eof()) ? 0 : __c; }
};
#ifdef _GLIBCXX_USE_WCHAR_T
///\ 21\.1\.3\.2\ \ char_traits\ specializations
template<>
struct char_traits<wchar_t>
{
typedef wchar_t char_type;
typedef wint_t int_type;
typedef streamoff off_type;
typedef wstreampos pos_type;
typedef mbstate_t state_type;
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ __c1 = __c2; }
static _GLIBCXX_CONSTEXPR bool
eq(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR bool
lt(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 < __c2; }
static _GLIBCXX17_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return 0;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__builtin_constant_p(__n)
&& __constant_char_array_p(__s1, __n)
&& __constant_char_array_p(__s2, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::compare(__s1, __s2, __n);
#endif
return wmemcmp(__s1, __s2, __n);
}
static _GLIBCXX17_CONSTEXPR size_t
length(const char_type* __s)
{
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__constant_string_p(__s))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::length(__s);
#endif
return wcslen(__s);
}
static _GLIBCXX17_CONSTEXPR const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
if (__n == 0)
return 0;
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
if (__builtin_constant_p(__n)
&& __builtin_constant_p(__a)
&& __constant_char_array_p(__s, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::find(__s, __n, __a);
#endif
return wmemchr(__s, __a, __n);
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return wmemmove(__s1, __s2, __n);
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return wmemcpy(__s1, __s2, __n);
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
if (__n == 0)
return __s;
return wmemset(__s, __a, __n);
}
static _GLIBCXX_CONSTEXPR char_type
to_char_type(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return char_type(__c); }
static _GLIBCXX_CONSTEXPR int_type
to_int_type(const char_type& __c) _GLIBCXX_NOEXCEPT
{ return int_type(__c); }
static _GLIBCXX_CONSTEXPR bool
eq_int_type(const int_type& __c1, const int_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR int_type
eof() _GLIBCXX_NOEXCEPT
{ return static_cast(WEOF); }
static _GLIBCXX_CONSTEXPR int_type
not_eof(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return eq_int_type(__c, eof()) ? 0 : __c; }
};
#endif //_GLIBCXX_USE_WCHAR_T
#ifdef _GLIBCXX_USE_CHAR8_T
template<>
struct char_traits<char8_t>
{
typedef char8_t char_type;
typedef unsigned int int_type;
typedef u8streampos pos_type;
typedef streamoff off_type;
typedef mbstate_t state_type;
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ __c1 = __c2; }
static _GLIBCXX_CONSTEXPR bool
eq(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR bool
lt(const char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 < __c2; }
static _GLIBCXX17_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return 0;
__cplusplus > __cplusplus > 201402 #if__cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus __cplusplus > __cplusplus > 201402 __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > 201402
if (__builtin_constant_p(__n)
&& __constant_char_array_p(__s1, __n)
&& __constant_char_array_p(__s2, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::compare(__s1, __s2, __n);
#endif
return __builtin_memcmp(__s1, __s2, __n);
}
static _GLIBCXX17_CONSTEXPR size_t
length(const char_type* __s)
{
__cplusplus > __cplusplus > 201402 #if__cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus __cplusplus > __cplusplus > 201402 __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > 201402
if (__constant_string_p(__s))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::length(__s);
#endif
size_t __i = 0;
while (!eq(__s[__i], char_type()))
++__i;
return __i;
}
static _GLIBCXX17_CONSTEXPR const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
if (__n == 0)
return 0;
__cplusplus > __cplusplus > 201402 #if__cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus __cplusplus > __cplusplus > 201402 __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > __cplusplus > 201402 __cplusplus > 201402
if (__builtin_constant_p(__n)
&& __builtin_constant_p(__a)
&& __constant_char_array_p(__s, __n))
return __gnu_<span class="namespc">cxx</span>::char_traits<char_type>::find(__s, __n, __a);
#endif
return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n));
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return static_cast(__builtin_memmove(__s1, __s2, __n));
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return static_cast(__builtin_memcpy(__s1, __s2, __n));
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
if (__n == 0)
return __s;
return static_cast(__builtin_memset(__s, __a, __n));
}
static _GLIBCXX_CONSTEXPR char_type
to_char_type(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return char_type(__c); }
static _GLIBCXX_CONSTEXPR int_type
to_int_type(const char_type& __c) _GLIBCXX_NOEXCEPT
{ return int_type(__c); }
static _GLIBCXX_CONSTEXPR bool
eq_int_type(const int_type& __c1, const int_type& __c2) _GLIBCXX_NOEXCEPT
{ return __c1 == __c2; }
static _GLIBCXX_CONSTEXPR int_type
eof() _GLIBCXX_NOEXCEPT
{ return static_cast(-1); }
static _GLIBCXX_CONSTEXPR int_type
not_eof(const int_type& __c) _GLIBCXX_NOEXCEPT
{ return eq_int_type(__c, eof()) ? 0 : __c; }
};
#endif //_GLIBCXX_USE_CHAR8_T
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<>
struct char_traits<char16_t>
{
typedef char16_t char_type;
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
typedef uint_least16_t int_type;
#elif defined defined __UINT_LEAST16_TYPE__ defined __UINT_LEAST16_TYPE__
typedef __UINT_LEAST16_TYPE__ int_type;
#else
typedef make_unsigned<char16_t>::type int_type;
#endif
typedef streamoff off_type;
typedef u16streampos pos_type;
typedef mbstate_t state_type;
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) noexcept
{ __c1 = __c2; }
static constexpr bool
eq(const char_type& __c1, const char_type& __c2) noexcept
{ return __c1 == __c2; }
static constexpr bool
lt(const char_type& __c1, const char_type& __c2) noexcept
{ return __c1 < __c2; }
static _GLIBCXX17_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
static _GLIBCXX17_CONSTEXPR size_t
length(const char_type* __s)
{
size_t __i = 0;
while (!eq(__s[__i], char_type()))
++__i;
return __i;
}
static _GLIBCXX17_CONSTEXPR const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (size_t __i = 0; __i < __n; ++__i)
if (eq(__s[__i], __a))
return __s + __i;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return (static_cast
(__builtin_memmove(__s1, __s2, __n * sizeof(char_type))));
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return (static_cast
(__builtin_memcpy(__s1, __s2, __n * sizeof(char_type))));
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (size_t __i = 0; __i < __n; ++__i)
assign(__s[__i], __a);
return __s;
}
static constexpr char_type
to_char_type(const int_type& __c) noexcept
{ return char_type(__c); }
static constexpr int_type
to_int_type(const char_type& __c) noexcept
{ return __c == eof() ? int_type(0xfffd) : int_type(__c); }
static constexpr bool
eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
{ return __c1 == __c2; }
static constexpr int_type
eof() noexcept
{ return static_cast(-1); }
static constexpr int_type
not_eof(const int_type& __c) noexcept
{ return eq_int_type(__c, eof()) ? 0 : __c; }
};
template<>
struct char_traits<char32_t>
{
typedef char32_t char_type;
#ifdef _GLIBCXX_USE_C99_STDINT_TR1
typedef uint_least32_t int_type;
#elif defined defined __UINT_LEAST32_TYPE__ defined __UINT_LEAST32_TYPE__
typedef __UINT_LEAST32_TYPE__ int_type;
#else
typedef make_unsigned<char32_t>::type int_type;
#endif
typedef streamoff off_type;
typedef u32streampos pos_type;
typedef mbstate_t state_type;
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) noexcept
{ __c1 = __c2; }
static constexpr bool
eq(const char_type& __c1, const char_type& __c2) noexcept
{ return __c1 == __c2; }
static constexpr bool
lt(const char_type& __c1, const char_type& __c2) noexcept
{ return __c1 < __c2; }
static _GLIBCXX17_CONSTEXPR int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{
for (size_t __i = 0; __i < __n; ++__i)
if (lt(__s1[__i], __s2[__i]))
return -1;
else if (lt(__s2[__i], __s1[__i]))
return 1;
return 0;
}
static _GLIBCXX17_CONSTEXPR size_t
length(const char_type* __s)
{
size_t __i = 0;
while (!eq(__s[__i], char_type()))
++__i;
return __i;
}
static _GLIBCXX17_CONSTEXPR const char_type*
find(const char_type* __s, size_t __n, const char_type& __a)
{
for (size_t __i = 0; __i < __n; ++__i)
if (eq(__s[__i], __a))
return __s + __i;
return 0;
}
static char_type*
move(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return (static_cast
(__builtin_memmove(__s1, __s2, __n * sizeof(char_type))));
}
static char_type*
copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (__n == 0)
return __s1;
return (static_cast
(__builtin_memcpy(__s1, __s2, __n * sizeof(char_type))));
}
static char_type*
assign(char_type* __s, size_t __n, char_type __a)
{
for (size_t __i = 0; __i < __n; ++__i)
assign(__s[__i], __a);
return __s;
}
static constexpr char_type
to_char_type(const int_type& __c) noexcept
{ return char_type(__c); }
static constexpr int_type
to_int_type(const char_type& __c) noexcept
{ return int_type(__c); }
static constexpr bool
eq_int_type(const int_type& __c1, const int_type& __c2) noexcept
{ return __c1 == __c2; }
static constexpr int_type
eof() noexcept
{ return static_cast(-1); }
static constexpr int_type
not_eof(const int_type& __c) noexcept
{ return eq_int_type(__c, eof()) ? 0 : __c; }
};
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif // //\ C11 //\ C11
#endif // //\ _CHAR_TRAITS_H //\ _CHAR_TRAITS_H
/usr/include/c++/9/bits/stl_vector.h
//\ Internal\ erase\ functions\ follow\.
//\ Called\ by\ erase\(q1,q2\),\ clear\(\),\ resize\(\),\ _M_fill_assign,
//\ _M_assign_aux\.
void
_M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
{
if (size_type __n = this->_M_impl._M_finish - __pos)
{
std::_Destroy(__pos, this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish = __pos;
_GLIBCXX_ASAN_ANNOTATE_SHRINK(__n);
}
}
iterator
_M_erase(iterator __position);
iterator
_M_erase(iterator __first, iterator __last);
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
private:
//\ Constant\-time\ move\ assignment\ when\ source\ object's\ memory\ can\ be
//\ moved,\ either\ because\ the\ source's\ allocator\ will\ move\ too
//\ or\ because\ the\ allocators\ are\ equal\.
void
_M_move_assign(vector&& __x, true_type) noexcept
{
vector __tmp(get_allocator());
this->_M_impl._M_swap_data(__x._M_impl);
__tmp._M_impl._M_swap_data(__x._M_impl);
std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
}
//\ Do\ move\ assignment\ when\ it\ might\ not\ be\ possible\ to\ move\ source
//\ object's\ memory,\ resulting\ in\ a\ linear\-time\ operation\.
void
_M_move_assign(vector&& __x, false_type)
{
if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
_M_move_assign(std::move(__x), true_type());
else
{
//\ The\ rvalue's\ allocator\ cannot\ be\ moved\ and\ is\ not\ equal,
//\ so\ we\ need\ to\ individually\ move\ each\ element\.
this->assign(std::__make_move_if_noexcept_iterator(__x.begin()),
std::__make_move_if_noexcept_iterator(__x.end()));
__x.clear();
}
}
#endif
template<typename _Up>
_Up*
_M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
{ return __ptr; }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Ptr>
typename <span class="namespc">std</span>::pointer_traits<_Ptr>::element_type*
_M_data_ptr(_Ptr __ptr) const
{ return empty() ? nullptr : std::__to_address(__ptr); }
#else
template<typename _Up>
_Up*
_M_data_ptr(_Up* __ptr) _GLIBCXX_NOEXCEPT
{ return __ptr; }
template<typename _Ptr>
value_type*
_M_data_ptr(_Ptr __ptr)
{ return empty() ? (value_type*)0 : __ptr.operator->(); }
template<typename _Ptr>
const value_type*
_M_data_ptr(_Ptr __ptr) const
{ return empty() ? (const value_type*)0 : __ptr.operator->(); }
#endif
};
#if __cpp_deduction_guides __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606
template<typename _InputIterator, typename _ValT
= typename iterator_traits<_InputIterator>::value_type,
typename _Allocator = allocator<_ValT>,
typename = _RequireInputIter<_InputIterator>,
typename = _RequireAllocator<_Allocator>>
vector(_InputIterator, _InputIterator, _Allocator = _Allocator())
-> vector<_ValT, _Allocator>;
#endif
/**
* @brief Vector equality comparison.
* @param __x A %vector.
* @param __y A %vector of the same type as @a __x.
* @return True iff the size and elements of the vectors are equal.
*
* This is an equivalence relation. It is linear in the size of the
* vectors. Vectors are considered equivalent if their sizes are equal,
* and if corresponding elements compare equal.
*/
template<typename _Tp, typename _Alloc>
inline bool
operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return (__x.size() == __y.size()
&& std::equal(__x.begin(), __x.end(), __y.begin())); }
/**
* @brief Vector ordering relation.
* @param __x A %vector.
* @param __y A %vector of the same type as @a __x.
* @return True iff @a __x is lexicographically less than @a __y.
*
* This is a total ordering relation. It is linear in the size of the
* vectors. The elements must be comparable with @c <.
*
* See std::lexicographical_compare() for how the determination is made.
*/
template<typename _Tp, typename _Alloc>
inline bool
operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return std::lexicographical_compare(__x.begin(), __x.end(),
__y.begin(), __y.end()); }
///\ Based\ on\ operator==
template<typename _Tp, typename _Alloc>
inline bool
operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return !(__x == __y); }
///\ Based\ on\ operator<
template<typename _Tp, typename _Alloc>
inline bool
operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return __y < __x; }
///\ Based\ on\ operator<
template<typename _Tp, typename _Alloc>
inline bool
operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return !(__y < __x); }
///\ Based\ on\ operator<
template<typename _Tp, typename _Alloc>
inline bool
operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
{ return !(__x < __y); }
///\ See\ std::vector::swap\(\)\.
template<typename _Tp, typename _Alloc>
inline void
swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
_GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
{ __x.swap(__y); }
_GLIBCXX_END_NAMESPACE_CONTAINER
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
namespace __detail::__variant
{
template<typename> struct _Never_valueless_alt; //\ see\
//\ Provide\ the\ strong\ exception\-safety\ guarantee\ when\ emplacing\ a
//\ vector\ into\ a\ variant,\ but\ only\ if\ move\ assignment\ cannot\ throw\.
template<typename _Tp, typename _Alloc>
struct _Never_valueless_alt<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
: std::is_nothrow_move_assignable<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
{ };
} //\ namespace\ __detail::__variant
#endif // //\ C17 //\ C17
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif /* /* _STL_VECTOR_H /* _STL_VECTOR_H */ /* _STL_VECTOR_H */ /* _STL_VECTOR_H /* _STL_VECTOR_H */ /* _STL_VECTOR_H */
/usr/include/c++/9/bits/allocator.h
friend bool
operator==(const allocator&, const allocator&) _GLIBCXX_NOTHROW
{ return true; }
friend bool
operator!=(const allocator&, const allocator&) _GLIBCXX_NOTHROW
{ return false; }
//\ Inherit\ everything\ else\.
};
template<typename _T1, typename _T2>
inline bool
operator==(const allocator<_T1>&, const allocator<_T2>&)
_GLIBCXX_NOTHROW
{ return true; }
template<typename _T1, typename _T2>
inline bool
operator!=(const allocator<_T1>&, const allocator<_T2>&)
_GLIBCXX_NOTHROW
{ return false; }
//\ Invalid\ allocator\ partial\ specializations\.
//\ allocator_traits::rebind_alloc\ can\ be\ used\ to\ form\ a\ valid\ allocator\ type\.
template<typename _Tp>
class allocator<const _Tp>
{
public:
typedef _Tp value_type;
template<typename _Up> allocator(const allocator<_Up>&) { }
};
template<typename _Tp>
class allocator<volatile _Tp>
{
public:
typedef _Tp value_type;
template<typename _Up> allocator(const allocator<_Up>&) { }
};
template<typename _Tp>
class allocator<const volatile _Tp>
{
public:
typedef _Tp value_type;
template<typename _Up> allocator(const allocator<_Up>&) { }
};
///\ @\}\ group\ allocator
//\ Inhibit\ implicit\ instantiations\ for\ required\ instantiations,
//\ which\ are\ defined\ via\ explicit\ instantiations\ elsewhere\.
#if _GLIBCXX_EXTERN_TEMPLATE
extern template class allocator<char>;
extern template class allocator<wchar_t>;
#endif
//\ Undefine\.
#undef __allocator_base
//\ To\ implement\ Option\ 3\ of\ DR\ 431\.
template<typename _Alloc, bool = __is_empty(_Alloc)>
struct __alloc_swap
{ static void _S_do_it(_Alloc&, _Alloc&) _GLIBCXX_NOEXCEPT { } };
template<typename _Alloc>
struct __alloc_swap<_Alloc, false>
{
static void
_S_do_it(_Alloc& __one, _Alloc& __two) _GLIBCXX_NOEXCEPT
{
//\ Precondition:\ swappable\ allocators\.
if (__one != __two)
swap(__one, __two);
}
};
//\ Optimize\ for\ stateless\ allocators\.
template<typename _Alloc, bool = __is_empty(_Alloc)>
struct __alloc_neq
{
static bool
_S_do_it(const _Alloc&, const _Alloc&)
{ return false; }
};
template<typename _Alloc>
struct __alloc_neq<_Alloc, false>
{
static bool
_S_do_it(const _Alloc& __one, const _Alloc& __two)
{ return __one != __two; }
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, bool
= __or_typename _Tp::value_type>,
is_nothrow_move_constructible<typename _<span class="namespc">Tp</span>::value_type>>::value>
struct __shrink_to_fit_aux
{ static bool _S_do_it(_Tp&) noexcept { return false; } };
template<typename _Tp>
struct __shrink_to_fit_aux<_Tp, true>
{
static bool
_S_do_it(_Tp& __c) noexcept
{
#if __cpp_exceptions
try
{
_Tp(__make_move_if_noexcept_iterator(__c.begin()),
__make_move_if_noexcept_iterator(__c.end()),
__c.get_allocator()).swap(__c);
return true;
}
catch(...)
{ return false; }
#else
return false;
#endif
}
};
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif
/usr/include/c++/9/bits/basic_string.tcc
template<typename _CharT, typename _Traits, typename _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __string_type::size_type __size_type;
__string_type __str;
const __size_type __len = __rhs.size();
__str.reserve(__len + 1);
__str.append(__size_type(1), __lhs);
__str.append(__rhs);
return __str;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
const size_type __size = this->size();
if (__n == 0)
return __pos <= __size ? __pos : npos;
if (__pos >= __size)
return npos;
const _CharT __elem0 = __s[0];
const _CharT* const __data = data();
const _CharT* __first = __data + __pos;
const _CharT* const __last = __data + __size;
size_type __len = __size - __pos;
while (__len >= __n)
{
//\ Find\ the\ first\ occurrence\ of\ __elem0:
__first = traits_type::find(__first, __len - __n + 1, __elem0);
if (!__first)
return npos;
//\ Compare\ the\ full\ strings\ from\ the\ first\ occurrence\ of\ __elem0\.
//\ We\ already\ know\ that\ __first\[0\]\ ==\ __s\[0\]\ but\ compare\ them\ again
//\ anyway\ because\ __s\ is\ probably\ aligned,\ which\ helps\ memcmp\.
if (traits_type::compare(__first, __s, __n) == 0)
return __first - __data;
__len = __last - ++__first;
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
{
size_type __ret = npos;
const size_type __size = this->size();
if (__pos < __size)
{
const _CharT* __data = _M_data();
const size_type __n = __size - __pos;
const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
if (__p)
__ret = __p - __data;
}
return __ret;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
rfind(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
const size_type __size = this->size();
if (__n <= __size)
{
__pos = std::min(size_type(__size - __n), __pos);
const _CharT* __data = _M_data();
do
{
if (traits_type::compare(__data + __pos, __s, __n) == 0)
return __pos;
}
while (__pos-- > 0);
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
rfind(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
{
size_type __size = this->size();
if (__size)
{
if (--__size > __pos)
__size = __pos;
for (++__size; __size-- > 0; )
if (traits_type::eq(_M_data()[__size], __c))
return __size;
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
for (; __n && __pos < this->size(); ++__pos)
{
const _CharT* __p = traits_type::find(__s, __n, _M_data()[__pos]);
if (__p)
return __pos;
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
size_type __size = this->size();
if (__size && __n)
{
if (--__size > __pos)
__size = __pos;
do
{
if (traits_type::find(__s, __n, _M_data()[__size]))
return __size;
}
while (__size-- != 0);
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
for (; __pos < this->size(); ++__pos)
if (!traits_type::find(__s, __n, _M_data()[__pos]))
return __pos;
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_first_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
{
for (; __pos < this->size(); ++__pos)
if (!traits_type::eq(_M_data()[__pos], __c))
return __pos;
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
_GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string_len(__s, __n);
size_type __size = this->size();
if (__size)
{
if (--__size > __pos)
__size = __pos;
do
{
if (!traits_type::find(__s, __n, _M_data()[__size]))
return __size;
}
while (__size--);
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
typename basic_string<_CharT, _Traits, _Alloc>::size_type
basic_string<_CharT, _Traits, _Alloc>::
find_last_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
{
size_type __size = this->size();
if (__size)
{
if (--__size > __pos)
__size = __pos;
do
{
if (!traits_type::eq(_M_data()[__size], __c))
return __size;
}
while (__size--);
}
return npos;
}
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string<_CharT, _Traits, _Alloc>::
compare(size_type __pos, size_type __n, const basic_string& __str) const
{
_M_check(__pos, "basic_string::compare");
__n = _M_limit(__pos, __n);
const size_type __osize = __str.size();
const size_type __len = std::min(__n, __osize);
int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
if (!__r)
__r = _S_compare(__n, __osize);
return __r;
}
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string<_CharT, _Traits, _Alloc>::
compare(size_type __pos1, size_type __n1, const basic_string& __str,
size_type __pos2, size_type __n2) const
{
_M_check(__pos1, "basic_string::compare");
__str._M_check(__pos2, "basic_string::compare");
__n1 = _M_limit(__pos1, __n1);
__n2 = __str._M_limit(__pos2, __n2);
const size_type __len = std::min(__n1, __n2);
int __r = traits_type::compare(_M_data() + __pos1,
__str.data() + __pos2, __len);
if (!__r)
__r = _S_compare(__n1, __n2);
return __r;
}
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string<_CharT, _Traits, _Alloc>::
compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT
{
__glibcxx_requires_string(__s);
const size_type __size = this->size();
const size_type __osize = traits_type::length(__s);
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __s, __len);
if (!__r)
__r = _S_compare(__size, __osize);
return __r;
}
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string <_CharT, _Traits, _Alloc>::
compare(size_type __pos, size_type __n1, const _CharT* __s) const
{
__glibcxx_requires_string(__s);
_M_check(__pos, "basic_string::compare");
__n1 = _M_limit(__pos, __n1);
const size_type __osize = traits_type::length(__s);
const size_type __len = std::min(__n1, __osize);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
__r = _S_compare(__n1, __osize);
return __r;
}
template<typename _CharT, typename _Traits, typename _Alloc>
int
basic_string <_CharT, _Traits, _Alloc>::
compare(size_type __pos, size_type __n1, const _CharT* __s,
size_type __n2) const
{
__glibcxx_requires_string_len(__s, __n2);
_M_check(__pos, "basic_string::compare");
__n1 = _M_limit(__pos, __n1);
const size_type __len = std::min(__n1, __n2);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
__r = _S_compare(__n1, __n2);
return __r;
}
//\ 21\.3\.7\.9\ basic_string::getline\ and\ operators
template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __in,
basic_string<_CharT, _Traits, _Alloc>& __str)
{
typedef basic_istream<_CharT, _Traits> __istream_type;
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __istream_type::ios_base __ios_base;
typedef typename __istream_type::int_type __int_type;
typedef typename __string_type::size_type __size_type;
typedef ctype<_CharT> __ctype_type;
typedef typename __ctype_type::ctype_base __ctype_base;
__size_type __extracted = 0;
typename __ios_base::iostate __err = __ios_base::goodbit;
typename __istream_type::sentry __cerb(__in, false);
if (__cerb)
{
__try
{
//\ Avoid\ reallocation\ for\ common\ case\.
__str.erase();
_CharT __buf[128];
__size_type __len = 0;
const streamsize __w = __in.width();
const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
: __str.max_size();
const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
const __int_type __eof = _Traits::eof();
__int_type __c = __in.rdbuf()->sgetc();
while (__extracted < __n
&& !_Traits::eq_int_type(__c, __eof)
&& !__ct.is(__ctype_base::space,
_Traits::to_char_type(__c)))
{
if (__len == sizeof(__buf) / sizeof(_CharT))
{
__str.append(__buf, sizeof(__buf) / sizeof(_CharT));
__len = 0;
}
__buf[__len++] = _Traits::to_char_type(__c);
++__extracted;
__c = __in.rdbuf()->snextc();
}
__str.append(__buf, __len);
if (_Traits::eq_int_type(__c, __eof))
__err |= __ios_base::eofbit;
__in.width(0);
}
__catch(__cxxabiv1::__forced_unwind&)
{
__in._M_setstate(__ios_base::badbit);
__throw_exception_again;
}
__catch(...)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 91\.\ Description\ of\ operator>>\ and\ getline\(\)\ for\ string<>
//\ might\ cause\ endless\ loop
__in._M_setstate(__ios_base::badbit);
}
}
//\ 211\.\ \ operator>>\(istream&,\ string&\)\ doesn't\ set\ failbit
if (!__extracted)
__err |= __ios_base::failbit;
if (__err)
__in.setstate(__err);
return __in;
}
template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT, _Traits>& __in,
basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
{
typedef basic_istream<_CharT, _Traits> __istream_type;
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __istream_type::ios_base __ios_base;
typedef typename __istream_type::int_type __int_type;
typedef typename __string_type::size_type __size_type;
__size_type __extracted = 0;
const __size_type __n = __str.max_size();
typename __ios_base::iostate __err = __ios_base::goodbit;
typename __istream_type::sentry __cerb(__in, true);
if (__cerb)
{
__try
{
__str.erase();
const __int_type __idelim = _Traits::to_int_type(__delim);
const __int_type __eof = _Traits::eof();
__int_type __c = __in.rdbuf()->sgetc();
while (__extracted < __n
&& !_Traits::eq_int_type(__c, __eof)
&& !_Traits::eq_int_type(__c, __idelim))
{
__str += _Traits::to_char_type(__c);
++__extracted;
__c = __in.rdbuf()->snextc();
}
if (_Traits::eq_int_type(__c, __eof))
__err |= __ios_base::eofbit;
else if (_Traits::eq_int_type(__c, __idelim))
{
++__extracted;
__in.rdbuf()->sbumpc();
}
else
__err |= __ios_base::failbit;
}
__catch(__cxxabiv1::__forced_unwind&)
{
__in._M_setstate(__ios_base::badbit);
__throw_exception_again;
}
__catch(...)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 91\.\ Description\ of\ operator>>\ and\ getline\(\)\ for\ string<>
//\ might\ cause\ endless\ loop
__in._M_setstate(__ios_base::badbit);
}
}
if (!__extracted)
__err |= __ios_base::failbit;
if (__err)
__in.setstate(__err);
return __in;
}
//\ Inhibit\ implicit\ instantiations\ for\ required\ instantiations,
//\ which\ are\ defined\ via\ explicit\ instantiations\ elsewhere\.
#if _GLIBCXX_EXTERN_TEMPLATE
//\ The\ explicit\ instantiations\ definitions\ in\ src/c11/string\-inst\.cc
//\ are\ compiled\ as\ C14,\ so\ the\ new\ C17\ members\ aren't\ instantiated\.
//\ Until\ those\ definitions\ are\ compiled\ as\ C17\ suppress\ the\ declaration,
//\ so\ C17\ code\ will\ implicitly\ instantiate\ std::string\ and\ std::wstring
//\ as\ needed\.
if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 #if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0
extern template class basic_string<char>;
# elif elif ! elif ! _GLIBCXX_USE_CXX11_ABI elif ! _GLIBCXX_USE_CXX11_ABI elif ! elif ! _GLIBCXX_USE_CXX11_ABI elif ! _GLIBCXX_USE_CXX11_ABI
//\ Still\ need\ to\ prevent\ implicit\ instantiation\ of\ the\ COW\ empty\ rep,
//\ to\ ensure\ the\ definition\ in\ libstdc\.so\ is\ unique\ \(PR\ 86138\)\.
extern template basic_string<char>::size_type
basic_string<char>::_Rep::_S_empty_rep_storage[];
# endif
extern template
basic_istream<char>&
operator>>(basic_istream<char>&, string&);
extern template
basic_ostream<char>&
operator<<(basic_ostream<char>&, const string&);
extern template
basic_istream<char>&
getline(basic_istream<char>&, string&, char);
extern template
basic_istream<char>&
getline(basic_istream<char>&, string&);
#ifdef _GLIBCXX_USE_WCHAR_T
if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 #if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0 if __cplusplus <= 201703L && _GLIBCXX_EXTERN_TEMPLATE > 0
extern template class basic_string<wchar_t>;
# elif elif ! elif ! _GLIBCXX_USE_CXX11_ABI elif ! _GLIBCXX_USE_CXX11_ABI elif ! elif ! _GLIBCXX_USE_CXX11_ABI elif ! _GLIBCXX_USE_CXX11_ABI
extern template basic_string<wchar_t>::size_type
basic_string<wchar_t>::_Rep::_S_empty_rep_storage[];
# endif
extern template
basic_istream<wchar_t>&
operator>>(basic_istream<wchar_t>&, wstring&);
extern template
basic_ostream<wchar_t>&
operator<<(basic_ostream<wchar_t>&, const wstring&);
extern template
basic_istream<wchar_t>&
getline(basic_istream<wchar_t>&, wstring&, wchar_t);
extern template
basic_istream<wchar_t>&
getline(basic_istream<wchar_t>&, wstring&);
#endif // //\ _GLIBCXX_USE_WCHAR_T //\ _GLIBCXX_USE_WCHAR_T
#endif // //\ _GLIBCXX_EXTERN_TEMPLATE //\ _GLIBCXX_EXTERN_TEMPLATE
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif
/usr/include/c++/9/bits/basic_string.h
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
_CharT __rhs)
{ return std::move(__lhs.append(1, __rhs)); }
#endif
//\ operator\ ==
/**
* @brief Test equivalence of two strings.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.compare(__rhs) == 0; }
template<typename _CharT>
inline
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>h<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>C<span class="namespc"></span>h<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span>T<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>b<span class="namespc"></span>o<span class="namespc"></span>o<span class="namespc"></span>l<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
operator==(const basic_string<_CharT>& __lhs,
const basic_string<_CharT>& __rhs) _GLIBCXX_NOEXCEPT
{ return (__lhs.size() == __rhs.size()
&& !<span class="namespc">std</span>::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
__lhs.size())); }
/**
* @brief Test equivalence of C string and string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) == 0; }
/**
* @brief Test equivalence of string and C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) == 0; }
//\ operator\ !=
/**
* @brief Test difference of two strings.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return !(__lhs == __rhs); }
/**
* @brief Test difference of C string and string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __rhs.compare(@a __lhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator!=(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return !(__lhs == __rhs); }
/**
* @brief Test difference of string and C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs.compare(@a __rhs) != 0. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return !(__lhs == __rhs); }
//\ operator\ <
/**
* @brief Test if string precedes string.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs precedes @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.compare(__rhs) < 0; }
/**
* @brief Test if string precedes C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs precedes @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) < 0; }
/**
* @brief Test if C string precedes string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __lhs precedes @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) > 0; }
//\ operator\ >
/**
* @brief Test if string follows string.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs follows @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.compare(__rhs) > 0; }
/**
* @brief Test if string follows C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs follows @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) > 0; }
/**
* @brief Test if C string follows string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __lhs follows @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) < 0; }
//\ operator\ <=
/**
* @brief Test if string doesn't follow string.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.compare(__rhs) <= 0; }
/**
* @brief Test if string doesn't follow C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) <= 0; }
/**
* @brief Test if C string doesn't follow string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __lhs doesn't follow @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator<=(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) >= 0; }
//\ operator\ >=
/**
* @brief Test if string doesn't precede string.
* @param __lhs First string.
* @param __rhs Second string.
* @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT
{ return __lhs.compare(__rhs) >= 0; }
/**
* @brief Test if string doesn't precede C string.
* @param __lhs String.
* @param __rhs C string.
* @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{ return __lhs.compare(__rhs) >= 0; }
/**
* @brief Test if C string doesn't precede string.
* @param __lhs C string.
* @param __rhs String.
* @return True if @a __lhs doesn't precede @a __rhs. False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator>=(const _CharT* __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare(__lhs) <= 0; }
/**
* @brief Swap contents of two strings.
* @param __lhs First string.
* @param __rhs Second string.
*
* Exchanges the contents of @a __lhs and @a __rhs in constant time.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline void
swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
basic_string<_CharT, _Traits, _Alloc>& __rhs)
_GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs)))
{ __lhs.swap(__rhs); }
/**
* @brief Read stream into a string.
* @param __is Input stream.
* @param __str Buffer to store into.
* @return Reference to the input stream.
*
* Stores characters from @a __is into @a __str until whitespace is
* found, the end of the stream is encountered, or str.max_size()
* is reached. If is.width() is non-zero, that is the limit on the
* number of characters stored into @a __str. Any previous
* contents of @a __str are erased.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str);
template<>
basic_istream<char>&
operator>>(basic_istream<char>& __is, basic_string<char>& __str);
/**
* @brief Write string to a stream.
* @param __os Output stream.
* @param __str String to write out.
* @return Reference to the output stream.
*
* Output characters of @a __str into os following the same rules as for
* writing a C string.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os,
const basic_string<_CharT, _Traits, _Alloc>& __str)
{
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 586\.\ string\ inserter\ not\ a\ formatted\ function
return __ostream_insert(__os, __str.data(), __str.size());
}
/**
* @brief Read a line from stream into a string.
* @param __is Input stream.
* @param __str Buffer to store into.
* @param __delim Character marking end of line.
* @return Reference to the input stream.
*
* Stores characters from @a __is into @a __str until @a __delim is
* found, the end of the stream is encountered, or str.max_size()
* is reached. Any previous contents of @a __str are erased. If
* @a __delim is encountered, it is extracted but not stored into
* @a __str.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
/**
* @brief Read a line from stream into a string.
* @param __is Input stream.
* @param __str Buffer to store into.
* @return Reference to the input stream.
*
* Stores characters from is into @a __str until '\n' is
* found, the end of the stream is encountered, or str.max_size()
* is reached. Any previous contents of @a __str are erased. If
* end of line is encountered, it is extracted but not stored into
* @a __str.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Alloc>& __str)
{ return std::getline(__is, __str, __is.widen('\n')); }
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
///\ Read\ a\ line\ from\ an\ rvalue\ stream\ into\ a\ string\.
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT, _Traits>&& __is,
basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
{ return std::getline(__is, __str, __delim); }
///\ Read\ a\ line\ from\ an\ rvalue\ stream\ into\ a\ string\.
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT, _Traits>&& __is,
basic_string<_CharT, _Traits, _Alloc>& __str)
{ return std::getline(__is, __str); }
#endif
template<>
basic_istream<char>&
getline(basic_istream<char>& __in, basic_string<char>& __str,
char __delim);
#ifdef _GLIBCXX_USE_WCHAR_T
template<>
basic_istream<wchar_t>&
getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
wchar_t __delim);
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_BEGIN_NAMESPACE_CXX11
#if _GLIBCXX_USE_C99_STDLIB
//\ 21\.4\ Numeric\ Conversions\ \[string\.conversions\]\.
inline int
stoi(const string& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
__idx, __base); }
inline long
stol(const string& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
__idx, __base); }
inline unsigned long
stoul(const string& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
__idx, __base); }
inline long long
stoll(const string& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
__idx, __base); }
inline unsigned long long
stoull(const string& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
__idx, __base); }
//\ NB:\ strtof\ vs\ strtod\.
inline float
stof(const string& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
inline double
stod(const string& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
inline long double
stold(const string& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
#endif // //\ _GLIBCXX_USE_C99_STDLIB //\ _GLIBCXX_USE_C99_STDLIB
#if _GLIBCXX_USE_C99_STDIO
//\ NB:\ \(v\)snprintf\ vs\ sprintf\.
//\ DR\ 1261\.
inline string
to_string(int __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf, 4 * sizeof(int),
"%d", __val); }
inline string
to_string(unsigned __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf,
4 * sizeof(unsigned),
"%u", __val); }
inline string
to_string(long __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf, 4 * sizeof(long),
"%ld", __val); }
inline string
to_string(unsigned long __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf,
4 * sizeof(unsigned long),
"%lu", __val); }
inline string
to_string(long long __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf,
4 * sizeof(long long),
"%lld", __val); }
inline string
to_string(unsigned long long __val)
{ return __gnu_cxx::__to_xstring(&std::vsnprintf,
4 * sizeof(unsigned long long),
"%llu", __val); }
inline string
to_string(float __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<float>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vsnprintf, __n,
"%f", __val);
}
inline string
to_string(double __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<double>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vsnprintf, __n,
"%f", __val);
}
inline string
to_string(long double __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<long double>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vsnprintf, __n,
"%Lf", __val);
}
#endif // //\ _GLIBCXX_USE_C99_STDIO //\ _GLIBCXX_USE_C99_STDIO
#if defined(_GLIBCXX_USE_WCHAR_T) defined(_GLIBCXX_USE_WCHAR_T) && defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR defined(_GLIBCXX_USE_WCHAR_T) && defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR
inline int
stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
__idx, __base); }
inline long
stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
__idx, __base); }
inline unsigned long
stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
__idx, __base); }
inline long long
stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
__idx, __base); }
inline unsigned long long
stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
{ return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
__idx, __base); }
//\ NB:\ wcstof\ vs\ wcstod\.
inline float
stof(const wstring& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
inline double
stod(const wstring& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
inline long double
stold(const wstring& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
//\ DR\ 1261\.
inline wstring
to_wstring(int __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf, 4 * sizeof(int),
L"%d", __val); }
inline wstring
to_wstring(unsigned __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf,
4 * sizeof(unsigned),
L"%u", __val); }
inline wstring
to_wstring(long __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf, 4 * sizeof(long),
L"%ld", __val); }
inline wstring
to_wstring(unsigned long __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf,
4 * sizeof(unsigned long),
L"%lu", __val); }
inline wstring
to_wstring(long long __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf,
4 * sizeof(long long),
L"%lld", __val); }
inline wstring
to_wstring(unsigned long long __val)
{ return __gnu_cxx::__to_xstring(&std::vswprintf,
4 * sizeof(unsigned long long),
L"%llu", __val); }
inline wstring
to_wstring(float __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<float>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vswprintf, __n,
L"%f", __val);
}
inline wstring
to_wstring(double __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<double>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vswprintf, __n,
L"%f", __val);
}
inline wstring
to_wstring(long double __val)
{
const int __n =
__gnu_<span class="namespc">cxx</span>::__numeric_traits<long double>::__max_exponent10 + 20;
return __gnu_cxx::__to_xstring(&std::vswprintf, __n,
L"%Lf", __val);
}
#endif // //\ _GLIBCXX_HAVE_BROKEN_VSWPRINTF //\ _GLIBCXX_HAVE_BROKEN_VSWPRINTF
#endif // // _GLIBCXX_USE_WCHAR_T // _GLIBCXX_USE_WCHAR_T && //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR // _GLIBCXX_USE_WCHAR_T && //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR // _GLIBCXX_USE_WCHAR_T // _GLIBCXX_USE_WCHAR_T && //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR // _GLIBCXX_USE_WCHAR_T && //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR //\ _GLIBCXX_USE_WCHAR_T\ &&\ _GLIBCXX_USE_C99_WCHAR
_GLIBCXX_END_NAMESPACE_CXX11
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif /* /* C++11 /* C++11 */ /* C++11 */ /* C++11 /* C++11 */ /* C++11 */
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
#include
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
//\ DR\ 1182\.
#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
///\ std::hash\ specialization\ for\ string\.
template<>
struct hash
: public __hash_base
{
size_t
operator()(const string& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(), __s.length()); }
};
template<>
struct __is_fast_hash> : std::false_type
{ };
#ifdef _GLIBCXX_USE_WCHAR_T
///\ std::hash\ specialization\ for\ wstring\.
template<>
struct hash
: public __hash_base
{
size_t
operator()(const wstring& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(wchar_t)); }
};
template<>
struct __is_fast_hash> : std::false_type
{ };
#endif
#endif /* /* _GLIBCXX_COMPATIBILITY_CXX0X /* _GLIBCXX_COMPATIBILITY_CXX0X */ /* _GLIBCXX_COMPATIBILITY_CXX0X */ /* _GLIBCXX_COMPATIBILITY_CXX0X /* _GLIBCXX_COMPATIBILITY_CXX0X */ /* _GLIBCXX_COMPATIBILITY_CXX0X */
#ifdef _GLIBCXX_USE_CHAR8_T
///\ std::hash\ specialization\ for\ u8string\.
template<>
struct hash
: public __hash_base
{
size_t
operator()(const u8string& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(char8_t)); }
};
template<>
struct __is_fast_hash> : std::false_type
{ };
#endif
///\ std::hash\ specialization\ for\ u16string\.
template<>
struct hash
: public __hash_base
{
size_t
operator()(const u16string& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(char16_t)); }
};
template<>
struct __is_fast_hash> : std::false_type
{ };
///\ std::hash\ specialization\ for\ u32string\.
template<>
struct hash
: public __hash_base
{
size_t
operator()(const u32string& __s) const noexcept
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(char32_t)); }
};
template<>
struct __is_fast_hash> : std::false_type
{ };
#if __cplusplus __cplusplus >= __cplusplus >= 201402L __cplusplus >= 201402L __cplusplus >= __cplusplus >= 201402L __cplusplus >= 201402L
#define __cpp_lib_string_udls __cpp_lib_string_udls 201304 __cpp_lib_string_udls 201304
inline namespace literals
{
inline namespace string_literals
{
#pragma GCC GCC diagnostic GCC diagnostic push GCC diagnostic push GCC diagnostic GCC diagnostic push GCC diagnostic push
#pragma GCC GCC diagnostic GCC diagnostic ignored GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic GCC diagnostic ignored GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored GCC diagnostic ignored "-Wliteral-suffix" GCC diagnostic ignored "-Wliteral-suffix"
_GLIBCXX_DEFAULT_ABI_TAG
inline basic_string<char>
operator""s(const char* __str, size_t __len)
{ return basic_string<char>{__str, __len}; }
#ifdef _GLIBCXX_USE_WCHAR_T
_GLIBCXX_DEFAULT_ABI_TAG
inline basic_string<wchar_t>
operator""s(const wchar_t* __str, size_t __len)
{ return basic_string<wchar_t>{__str, __len}; }
#endif
#ifdef _GLIBCXX_USE_CHAR8_T
_GLIBCXX_DEFAULT_ABI_TAG
inline basic_string<char8_t>
operator""s(const char8_t* __str, size_t __len)
{ return basic_string<char8_t>{__str, __len}; }
#endif
_GLIBCXX_DEFAULT_ABI_TAG
inline basic_string<char16_t>
operator""s(const char16_t* __str, size_t __len)
{ return basic_string<char16_t>{__str, __len}; }
_GLIBCXX_DEFAULT_ABI_TAG
inline basic_string<char32_t>
operator""s(const char32_t* __str, size_t __len)
{ return basic_string<char32_t>{__str, __len}; }
#pragma GCC GCC diagnostic GCC diagnostic pop GCC diagnostic pop GCC diagnostic GCC diagnostic pop GCC diagnostic pop
} //\ inline\ namespace\ string_literals
} //\ inline\ namespace\ literals
#if __cplusplus __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L __cplusplus >= __cplusplus >= 201703L __cplusplus >= 201703L
namespace __detail::__variant
{
template<typename> struct _Never_valueless_alt; //\ see\
//\ Provide\ the\ strong\ exception\-safety\ guarantee\ when\ emplacing\ a
//\ basic_string\ into\ a\ variant,\ but\ only\ if\ moving\ the\ string\ cannot\ throw\.
template<typename _Tp, typename _Traits, typename _Alloc>
struct _Never_valueless_alt<std::basic_string<_Tp, _Traits, _Alloc>>
: __and_<
is_nothrow_move_constructible<std::basic_string<_Tp, _Traits, _Alloc>>,
is_nothrow_move_assignable<std::basic_string<_Tp, _Traits, _Alloc>>
>::type
{ };
} //\ namespace\ __detail::__variant
#endif // //\ C17 //\ C17
#endif // //\ C14 //\ C14
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif // //\ C11 //\ C11
#endif /* /* _BASIC_STRING_H /* _BASIC_STRING_H */ /* _BASIC_STRING_H */ /* _BASIC_STRING_H /* _BASIC_STRING_H */ /* _BASIC_STRING_H */
/usr/include/c++/9/bits/move.h
template<typename _Tp>
struct __move_if_noexcept_cond
: public __and_<__not_>,
is_copy_constructible<_Tp>>::type { };
/**
* @brief Conditionally convert a value to an rvalue.
* @param __x A thing of arbitrary type.
* @return The parameter, possibly cast to an rvalue-reference.
*
* Same as std::move unless the type's move constructor could throw and the
* type is copyable, in which case an lvalue-reference is returned instead.
*/
template<typename _Tp>
constexpr typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>d<span class="namespc"></span>i<span class="namespc"></span>t<span class="namespc"></span>i<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span>_<span class="namespc"></span>n<span class="namespc"></span>o<span class="namespc"></span>e<span class="namespc"></span>x<span class="namespc"></span>c<span class="namespc"></span>e<span class="namespc"></span>p<span class="namespc"></span>t<span class="namespc"></span>_<span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>d<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>o<span class="namespc"></span>n<span class="namespc"></span>s<span class="namespc"></span>t<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>&<span class="namespc"></span>&<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
move_if_noexcept(_Tp& __x) noexcept
{ return std::move(__x); }
//\ declval,\ from\ type_traits\.
__cplusplus > __cplusplus > 201402L #if__cplusplus > __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2296\.\ std::addressof\ should\ be\ constexpr
# define define __cpp_lib_addressof_constexpr define __cpp_lib_addressof_constexpr 201603 define __cpp_lib_addressof_constexpr 201603 define __cpp_lib_addressof_constexpr define __cpp_lib_addressof_constexpr 201603 define __cpp_lib_addressof_constexpr 201603
#endif
/**
* @brief Returns the actual address of the object or function
* referenced by r, even in the presence of an overloaded
* operator&.
* @param __r Reference to an object or function.
* @return The actual address.
*/
template<typename _Tp>
inline _GLIBCXX17_CONSTEXPR _Tp*
addressof(_Tp& __r) noexcept
{ return std::__addressof(__r); }
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 2598\.\ addressof\ works\ on\ temporaries
template<typename _Tp>
const _Tp* addressof(const _Tp&&) = delete;
//\ C11\ version\ of\ std::exchange\ for\ internal\ use\.
template <typename _Tp, typename _Up = _Tp>
inline _Tp
__exchange(_Tp& __obj, _Up&& __new_val)
{
_Tp __old_val = std::move(__obj);
__obj = std::forward<_Up>(__new_val);
return __old_val;
}
///\ @\}\ group\ utilities
#define _GLIBCXX_MOVE(__val) _GLIBCXX_MOVE(__val) std::move(__val) _GLIBCXX_MOVE(__val) std::move(__val)
#define _GLIBCXX_FORWARD(_Tp, _GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val) std::forward<_Tp>(_GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val) _GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val) std::forward<_Tp>(_GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)
#else
#define _GLIBCXX_MOVE(__val) _GLIBCXX_MOVE(__val) (__val) _GLIBCXX_MOVE(__val) (__val)
#define _GLIBCXX_FORWARD(_Tp, _GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) (__val) (_GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) (__val) _GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) (__val) (_GLIBCXX_FORWARD(_Tp, __val) _GLIBCXX_FORWARD(_Tp, __val) (__val)
#endif
/**
* @addtogroup utilities
* @{
*/
/**
* @brief Swaps two values.
* @param __a A thing of arbitrary type.
* @param __b Another thing of arbitrary type.
* @return Nothing.
*/
template<typename _Tp>
inline
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>,
is_move_constructible<_Tp>,
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>m<span class="namespc"></span>o<span class="namespc"></span>v<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>i<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
swap(_Tp& __a, _Tp& __b)
noexcept(__and_,
is_nothrow_move_assignable<_Tp>>::value)
#else
void
swap(_Tp& __a, _Tp& __b)
#endif
{
//\ concept\ requirements
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
_Tp __tmp = _GLIBCXX_MOVE(__a);
__a = _GLIBCXX_MOVE(__b);
__b = _GLIBCXX_MOVE(__tmp);
}
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ DR\ 809\.\ std::swap\ should\ be\ overloaded\ for\ array\ types\.
///\ Swap\ the\ contents\ of\ two\ arrays\.
template<typename _Tp, size_t _Nm>
inline
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>w<span class="namespc"></span>a<span class="namespc"></span>p<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
noexcept(__is_nothrow_swappable<_Tp>::value)
#else
void
swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
#endif
{
for (size_t __n = 0; __n < _Nm; ++__n)
swap(__a[__n], __b[__n]);
}
///\ @\}\ group\ utilities
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif /* /* _MOVE_H /* _MOVE_H */ /* _MOVE_H */ /* _MOVE_H /* _MOVE_H */ /* _MOVE_H */
/usr/include/c++/9/ext/new_allocator.h
#else
//\ _GLIBCXX_RESOLVE_LIB_DEFECTS
//\ 402\.\ wrong\ new\ expression\ in\ \[some_\]\ allocator::construct
void
construct(pointer __p, const _Tp& __val)
{ ::new((void *)__p) _Tp(__val); }
void
destroy(pointer __p) { __p->~_Tp(); }
#endif
template<typename _Up>
friend bool
operator==(const new_allocator&, const new_allocator<_Up>&)
_GLIBCXX_NOTHROW
{ return true; }
template<typename _Up>
friend bool
operator!=(const new_allocator&, const new_allocator<_Up>&)
_GLIBCXX_NOTHROW
{ return false; }
};
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif
/usr/include/c++/9/bits/stl_construct.h
__cplusplus > __cplusplus > 201402L #if__cplusplus > __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus __cplusplus > __cplusplus > 201402L __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > __cplusplus > 201402L __cplusplus > 201402L
template <typename _Tp>
inline void
destroy_at(_Tp* __location)
{
std::_Destroy(__location);
}
template <typename _ForwardIterator>
inline void
destroy(_ForwardIterator __first, _ForwardIterator __last)
{
std::_Destroy(__first, __last);
}
template <typename _ForwardIterator, typename _Size>
inline _ForwardIterator
destroy_n(_ForwardIterator __first, _Size __count)
{
return std::_Destroy_n(__first, __count);
}
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif /* /* _STL_CONSTRUCT_H /* _STL_CONSTRUCT_H */ /* _STL_CONSTRUCT_H */ /* _STL_CONSTRUCT_H /* _STL_CONSTRUCT_H */ /* _STL_CONSTRUCT_H */
/usr/include/c++/9/bits/vector.tcc
template<typename _Tp, typename _Alloc>
void
vector<_Tp, _Alloc>::
_M_fill_insert(iterator __position, size_type __n, const value_type& __x)
{
if (__n != 0)
{
if (size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_finish) >= __n)
{
__cplusplus < __cplusplus < 201103L span class="macro">#if__cplusplus < __cplusplus < 201103L /span> __cplusplus < __cplusplus < 201103L span class="macro_pred">__cplusplus __cplusplus < __cplusplus < 201103L __cplusplus < 201103L __cplusplus < __cplusplus < 201103L /span> __cplusplus < __cplusplus < 201103L __cplusplus < 201103L
value_type __x_copy = __x;
#else
_Temporary_value __tmp(this, __x);
value_type& __x_copy = __tmp._M_val();
#endif
const size_type __elems_after = end() - __position;
pointer __old_finish(this->_M_impl._M_finish);
if (__elems_after > __n)
{
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
_GLIBCXX_ASAN_ANNOTATE_GREW(__n);
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
__old_finish - __n, __old_finish);
std::fill(__position.base(), __position.base() + __n,
__x_copy);
}
else
{
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
this->_M_impl._M_finish =
std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
__n - __elems_after,
__x_copy,
_M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_GREW(__n - __elems_after);
std::__uninitialized_move_a(__position.base(), __old_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
_GLIBCXX_ASAN_ANNOTATE_GREW(__elems_after);
std::fill(__position.base(), __old_finish, __x_copy);
}
}
else
{
const size_type __len =
_M_check_len(__n, "vector::_M_fill_insert");
const size_type __elems_before = __position - begin();
pointer __new_start(this->_M_allocate(__len));
pointer __new_finish(__new_start);
__try
{
//\ See\ _M_realloc_insert\ above\.
std::__uninitialized_fill_n_a(__new_start + __elems_before,
__n, __x,
_M_get_Tp_allocator());
__new_finish = pointer();
__new_finish
= std::__uninitialized_move_if_noexcept_a
(this->_M_impl._M_start, __position.base(),
__new_start, _M_get_Tp_allocator());
__new_finish += __n;
__new_finish
= std::__uninitialized_move_if_noexcept_a
(__position.base(), this->_M_impl._M_finish,
__new_finish, _M_get_Tp_allocator());
}
__catch(...)
{
if (!__new_finish)
std::_Destroy(__new_start + __elems_before,
__new_start + __elems_before + __n,
_M_get_Tp_allocator());
else
std::_Destroy(__new_start, __new_finish,
_M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_REINIT;
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __new_start;
this->_M_impl._M_finish = __new_finish;
this->_M_impl._M_end_of_storage = __new_start + __len;
}
}
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Tp, typename _Alloc>
void
vector<_Tp, _Alloc>::
_M_default_append(size_type __n)
{
if (__n != 0)
{
const size_type __size = size();
size_type __navail = size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_finish);
if (__size > max_size() || __navail > max_size() - __size)
__builtin_unreachable();
if (__navail >= __n)
{
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
this->_M_impl._M_finish =
std::__uninitialized_default_n_a(this->_M_impl._M_finish,
__n, _M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_GREW(__n);
}
else
{
const size_type __len =
_M_check_len(__n, "vector::_M_default_append");
pointer __new_start(this->_M_allocate(__len));
if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
{
__try
{
std::__uninitialized_default_n_a(__new_start + __size,
__n, _M_get_Tp_allocator());
}
__catch(...)
{
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
_S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
__new_start, _M_get_Tp_allocator());
}
else
{
pointer __destroy_from = pointer();
__try
{
std::__uninitialized_default_n_a(__new_start + __size,
__n, _M_get_Tp_allocator());
__destroy_from = __new_start + __size;
std::__uninitialized_move_if_noexcept_a(
this->_M_impl._M_start, this->_M_impl._M_finish,
__new_start, _M_get_Tp_allocator());
}
__catch(...)
{
if (__destroy_from)
std::_Destroy(__destroy_from, __destroy_from + __n,
_M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
}
_GLIBCXX_ASAN_ANNOTATE_REINIT;
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __new_start;
this->_M_impl._M_finish = __new_start + __size + __n;
this->_M_impl._M_end_of_storage = __new_start + __len;
}
}
}
template<typename _Tp, typename _Alloc>
bool
vector<_Tp, _Alloc>::
_M_shrink_to_fit()
{
if (capacity() == size())
return false;
_GLIBCXX_ASAN_ANNOTATE_REINIT;
return <span class="namespc">std</span>::__shrink_to_fit_aux<vector>::_S_do_it(*this);
}
#endif
template<typename _Tp, typename _Alloc>
template<typename _InputIterator>
void
vector<_Tp, _Alloc>::
_M_range_insert(iterator __pos, _InputIterator __first,
_InputIterator __last, std::input_iterator_tag)
{
if (__pos == end())
{
for (; __first != __last; ++__first)
insert(end(), *__first);
}
else if (__first != __last)
{
vector __tmp(__first, __last, _M_get_Tp_allocator());
insert(__pos,
_GLIBCXX_MAKE_MOVE_ITERATOR(__tmp.begin()),
_GLIBCXX_MAKE_MOVE_ITERATOR(__tmp.end()));
}
}
template<typename _Tp, typename _Alloc>
template<typename _ForwardIterator>
void
vector<_Tp, _Alloc>::
_M_range_insert(iterator __position, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
if (__first != __last)
{
const size_type __n = std::distance(__first, __last);
if (size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_finish) >= __n)
{
const size_type __elems_after = end() - __position;
pointer __old_finish(this->_M_impl._M_finish);
if (__elems_after > __n)
{
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
_GLIBCXX_ASAN_ANNOTATE_GREW(__n);
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
__old_finish - __n, __old_finish);
std::copy(__first, __last, __position);
}
else
{
_ForwardIterator __mid = __first;
std::advance(__mid, __elems_after);
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n - __elems_after;
_GLIBCXX_ASAN_ANNOTATE_GREW(__n - __elems_after);
std::__uninitialized_move_a(__position.base(),
__old_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
_GLIBCXX_ASAN_ANNOTATE_GREW(__elems_after);
std::copy(__first, __mid, __position);
}
}
else
{
const size_type __len =
_M_check_len(__n, "vector::_M_range_insert");
pointer __new_start(this->_M_allocate(__len));
pointer __new_finish(__new_start);
__try
{
__new_finish
= std::__uninitialized_move_if_noexcept_a
(this->_M_impl._M_start, __position.base(),
__new_start, _M_get_Tp_allocator());
__new_finish
= std::__uninitialized_copy_a(__first, __last,
__new_finish,
_M_get_Tp_allocator());
__new_finish
= std::__uninitialized_move_if_noexcept_a
(__position.base(), this->_M_impl._M_finish,
__new_finish, _M_get_Tp_allocator());
}
__catch(...)
{
std::_Destroy(__new_start, __new_finish,
_M_get_Tp_allocator());
_M_deallocate(__new_start, __len);
__throw_exception_again;
}
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator());
_GLIBCXX_ASAN_ANNOTATE_REINIT;
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
this->_M_impl._M_start = __new_start;
this->_M_impl._M_finish = __new_finish;
this->_M_impl._M_end_of_storage = __new_start + __len;
}
}
}
//\ vector<bool>
template<typename _Alloc>
void
vector<bool, _Alloc>::
_M_reallocate(size_type __n)
{
_Bit_pointer __q = this->_M_allocate(__n);
iterator __start(std::__addressof(*__q), 0);
iterator __finish(_M_copy_aligned(begin(), end(), __start));
this->_M_deallocate();
this->_M_impl._M_start = __start;
this->_M_impl._M_finish = __finish;
this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
}
template<typename _Alloc>
void
vector<bool, _Alloc>::
_M_fill_insert(iterator __position, size_type __n, bool __x)
{
if (__n == 0)
return;
if (capacity() - size() >= __n)
{
std::copy_backward(__position, end(),
this->_M_impl._M_finish + difference_type(__n));
std::fill(__position, __position + difference_type(__n), __x);
this->_M_impl._M_finish += difference_type(__n);
}
else
{
const size_type __len =
_M_check_len(__n, <span class="str">"vector<bool>::_M_fill_insert"</span>);
_Bit_pointer __q = this->_M_allocate(__len);
iterator __start(std::__addressof(*__q), 0);
iterator __i = _M_copy_aligned(begin(), __position, __start);
std::fill(__i, __i + difference_type(__n), __x);
iterator __finish = std::copy(__position, end(),
__i + difference_type(__n));
this->_M_deallocate();
this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
this->_M_impl._M_start = __start;
this->_M_impl._M_finish = __finish;
}
}
template<typename _Alloc>
template<typename _ForwardIterator>
void
vector<bool, _Alloc>::
_M_insert_range(iterator __position, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
if (__first != __last)
{
size_type __n = std::distance(__first, __last);
if (capacity() - size() >= __n)
{
std::copy_backward(__position, end(),
this->_M_impl._M_finish
+ difference_type(__n));
std::copy(__first, __last, __position);
this->_M_impl._M_finish += difference_type(__n);
}
else
{
const size_type __len =
_M_check_len(__n, <span class="str">"vector<bool>::_M_insert_range"</span>);
_Bit_pointer __q = this->_M_allocate(__len);
iterator __start(std::__addressof(*__q), 0);
iterator __i = _M_copy_aligned(begin(), __position, __start);
__i = std::copy(__first, __last, __i);
iterator __finish = std::copy(__position, end(), __i);
this->_M_deallocate();
this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
this->_M_impl._M_start = __start;
this->_M_impl._M_finish = __finish;
}
}
}
template<typename _Alloc>
void
vector<bool, _Alloc>::
_M_insert_aux(iterator __position, bool __x)
{
if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
{
std::copy_backward(__position, this->_M_impl._M_finish,
this->_M_impl._M_finish + 1);
*__position = __x;
++this->_M_impl._M_finish;
}
else
{
const size_type __len =
_M_check_len(size_type(1), <span class="str">"vector<bool>::_M_insert_aux"</span>);
_Bit_pointer __q = this->_M_allocate(__len);
iterator __start(std::__addressof(*__q), 0);
iterator __i = _M_copy_aligned(begin(), __position, __start);
*__i++ = __x;
iterator __finish = std::copy(__position, end(), __i);
this->_M_deallocate();
this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
this->_M_impl._M_start = __start;
this->_M_impl._M_finish = __finish;
}
}
template<typename _Alloc>
typename vector<bool, _Alloc>::iterator
vector<bool, _Alloc>::
_M_erase(iterator __position)
{
if (__position + 1 != end())
std::copy(__position + 1, end(), __position);
--this->_M_impl._M_finish;
return __position;
}
template<typename _Alloc>
typename vector<bool, _Alloc>::iterator
vector<bool, _Alloc>::
_M_erase(iterator __first, iterator __last)
{
if (__first != __last)
_M_erase_at_end(std::copy(__last, end(), __first));
return __first;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Alloc>
bool
vector<bool, _Alloc>::
_M_shrink_to_fit()
{
if (capacity() - size() < int(_S_word_bit))
return false;
__try
{
_M_reallocate(size());
return true;
}
__catch(...)
{ return false; }
}
#endif
_GLIBCXX_END_NAMESPACE_CONTAINER
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _Alloc>
size_t
hash<_GLIB<span class="namespc">C</span>XX_STD_<span class="namespc">C</span>::vector<bool, _Alloc>>::
operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b) const noexcept
{
size_t __hash = 0;
using _GLIBCXX_STD_C::_S_word_bit;
using _GLIBCXX_STD_C::_Bit_type;
const size_t __words = __b.size() / _S_word_bit;
if (__words)
{
const size_t __clength = __words * sizeof(_Bit_type);
__hash = std::_Hash_impl::hash(__b._M_impl._M_start._M_p, __clength);
}
const size_t __extrabits = __b.size() % _S_word_bit;
if (__extrabits)
{
_Bit_type __hiword = *__b._M_impl._M_finish._M_p;
__hiword &= ~((~static_cast<_Bit_type>(0)) << __extrabits);
const size_t __clength
= (__extrabits + __CHAR_BIT__ - 1) / __CHAR_BIT__;
if (__words)
__hash = std::_Hash_impl::hash(&__hiword, __clength, __hash);
else
__hash = std::_Hash_impl::hash(&__hiword, __clength);
}
return __hash;
}
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif // //\ C11 //\ C11
#undef _GLIBCXX_ASAN_ANNOTATE_REINIT
#undef _GLIBCXX_ASAN_ANNOTATE_GROW
#undef _GLIBCXX_ASAN_ANNOTATE_GREW
#undef _GLIBCXX_ASAN_ANNOTATE_SHRINK
#endif /* /* _VECTOR_TCC /* _VECTOR_TCC */ /* _VECTOR_TCC */ /* _VECTOR_TCC /* _VECTOR_TCC */ /* _VECTOR_TCC */
/usr/include/c++/9/bits/alloc_traits.h
/**
* @brief Obtain an allocator to use when copying a container.
* @param __rhs An allocator.
* @return @c __rhs
*/
static allocator_type
select_on_container_copy_construction(const allocator_type& __rhs)
{ return __rhs; }
};
template<typename _Alloc>
inline void
__do_alloc_on_copy(_Alloc& __one, const _Alloc& __two, true_type)
{ __one = __two; }
template<typename _Alloc>
inline void
__do_alloc_on_copy(_Alloc&, const _Alloc&, false_type)
{ }
template<typename _Alloc>
inline void __alloc_on_copy(_Alloc& __one, const _Alloc& __two)
{
typedef allocator_traits<_Alloc> __traits;
typedef typename __traits::propagate_on_container_copy_assignment __pocca;
__do_alloc_on_copy(__one, __two, __pocca());
}
template<typename _Alloc>
inline _Alloc __alloc_on_copy(const _Alloc& __a)
{
typedef allocator_traits<_Alloc> __traits;
return __traits::select_on_container_copy_construction(__a);
}
template<typename _Alloc>
inline void __do_alloc_on_move(_Alloc& __one, _Alloc& __two, true_type)
{ __one = std::move(__two); }
template<typename _Alloc>
inline void __do_alloc_on_move(_Alloc&, _Alloc&, false_type)
{ }
template<typename _Alloc>
inline void __alloc_on_move(_Alloc& __one, _Alloc& __two)
{
typedef allocator_traits<_Alloc> __traits;
typedef typename __traits::propagate_on_container_move_assignment __pocma;
__do_alloc_on_move(__one, __two, __pocma());
}
template<typename _Alloc>
inline void __do_alloc_on_swap(_Alloc& __one, _Alloc& __two, true_type)
{
using std::swap;
swap(__one, __two);
}
template<typename _Alloc>
inline void __do_alloc_on_swap(_Alloc&, _Alloc&, false_type)
{ }
template<typename _Alloc>
inline void __alloc_on_swap(_Alloc& __one, _Alloc& __two)
{
typedef allocator_traits<_Alloc> __traits;
typedef typename __traits::propagate_on_container_swap __pocs;
__do_alloc_on_swap(__one, __two, __pocs());
}
template<typename _Alloc, typename _Tp,
typename _ValueT = __remove_cvref_t<typename _Alloc::value_type>,
typename = void>
struct __is_alloc_insertable_impl
: false_type
{ };
template<typename _Alloc, typename _Tp, typename _ValueT>
struct __is_alloc_insertable_impl<_Alloc, _Tp, _ValueT,
__void_t<decltype(allocator_traits<_Alloc>::construct(
std::declval<_Alloc&>(), std::declval<_ValueT*>(),
std::declval<_Tp>()))>>
: true_type
{ };
//\ true\ if\ _Alloc::value_type\ is\ CopyInsertable\ into\ containers\ using\ _Alloc
//\ \(might\ be\ wrong\ if\ _Alloc::construct\ exists\ but\ is\ not\ constrained,
//\ i\.e\.\ actually\ trying\ to\ use\ it\ would\ still\ be\ invalid\.\ Use\ with\ caution\.\)
template<typename _Alloc>
struct __is_copy_insertable
: __is_alloc_insertable_impl<_Alloc,
typename _<span class="namespc">Alloc</span>::value_type const&>::type
{ };
//\ std::allocator<_Tp>\ just\ requires\ CopyConstructible
template<typename _Tp>
struct __is_copy_insertable>
: is_copy_constructible<_Tp>
{ };
//\ true\ if\ _Alloc::value_type\ is\ MoveInsertable\ into\ containers\ using\ _Alloc
//\ \(might\ be\ wrong\ if\ _Alloc::construct\ exists\ but\ is\ not\ constrained,
//\ i\.e\.\ actually\ trying\ to\ use\ it\ would\ still\ be\ invalid\.\ Use\ with\ caution\.\)
template<typename _Alloc>
struct __is_move_insertable
: __is_alloc_insertable_impl<_<span class="namespc">Alloc</span>, typename _<span class="namespc">Alloc</span>::value_type>::type
{ };
//\ std::allocator<_Tp>\ just\ requires\ MoveConstructible
template<typename _Tp>
struct __is_move_insertable>
: is_move_constructible<_Tp>
{ };
//\ Trait\ to\ detect\ Allocator\-like\ types\.
template<typename _Alloc, typename = void>
struct __is_allocator : false_type { };
template<typename _Alloc>
struct __is_allocator<_Alloc,
__void_t<typename _Alloc::value_type,
decltype(std::declval<_Alloc&>().allocate(size_t{}))>>
: true_type { };
template<typename _Alloc>
using _RequireAllocator
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>=<span class="namespc"></span> <span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>;<span class="namespc"></span> <span class="namespc"></span>
template<typename _Alloc>
using _RequireNotAllocator
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>=<span class="namespc"></span> <span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>!<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>A<span class="namespc"></span>l<span class="namespc"></span>l<span class="namespc"></span>o<span class="namespc"></span>c<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>;<span class="namespc"></span> <span class="namespc"></span>
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
#endif // //\ C11 //\ C11
#endif // //\ _ALLOC_TRAITS_H //\ _ALLOC_TRAITS_H
/usr/include/c++/9/bits/stl_iterator.h
//\ @\}\ group\ iterators
template<typename _Iterator>
auto
__niter_base(move_iterator<_Iterator> __it)
-> decltype(make_move_iterator(__niter_base(__it.base())))
{ return make_move_iterator(__niter_base(__it.base())); }
template<typename _Iterator>
struct __is_move_iterator >
{
enum { __value = 1 };
typedef __true_type __type;
};
template<typename _Iterator>
auto
__miter_base(move_iterator<_Iterator> __it)
-> decltype(__miter_base(__it.base()))
{ return __miter_base(__it.base()); }
#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
std::__make_move_if_noexcept_iterator(_Iter)
#else
#define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
#define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
#endif // //\ C11 //\ C11
#if __cpp_deduction_guides __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= __cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201606
//\ These\ helper\ traits\ are\ used\ for\ deduction\ guides
//\ of\ associative\ containers\.
template<typename _InputIterator>
using __iter_key_t = remove_const_t<
typename iterator_traits<_InputIterator>::value_type::first_type>;
template<typename _InputIterator>
using __iter_val_t =
typename iterator_traits<_InputIterator>::value_type::second_type;
template<typename _T1, typename _T2>
struct pair;
template<typename _InputIterator>
using __iter_to_alloc_t =
pair>,
__iter_val_t<_InputIterator>>;
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#ifdef _GLIBCXX_DEBUG
# include include include
#endif
#endif
/usr/include/c++/9/bits/stl_uninitialized.h
#endif
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace
#endif /* /* _STL_UNINITIALIZED_H /* _STL_UNINITIALIZED_H */ /* _STL_UNINITIALIZED_H */ /* _STL_UNINITIALIZED_H /* _STL_UNINITIALIZED_H */ /* _STL_UNINITIALIZED_H */
/usr/include/c++/9/bits/stl_algobase.h
//\ Reverse\ the\ __niter_base\ transformation\ to\ get\ a
//\ __normal_iterator\ back\ again\ \(this\ assumes\ that\ __normal_iterator
//\ is\ only\ used\ to\ wrap\ random\ access\ iterators,\ like\ pointers\)\.
template<typename _From, typename _To>
inline _From
__niter_wrap(_From __from, _To __res)
{ return __from + (__res - std::__niter_base(__from)); }
//\ No\ need\ to\ wrap,\ iterator\ already\ has\ the\ right\ type\.
template<typename _Iterator>
inline _Iterator
__niter_wrap(const _Iterator&, _Iterator __res)
{ return __res; }
//\ All\ of\ these\ auxiliary\ structs\ serve\ two\ purposes\.\ \ \(1\)\ Replace
//\ calls\ to\ copy\ with\ memmove\ whenever\ possible\.\ \ \(Memmove,\ not\ memcpy,
//\ because\ the\ input\ and\ output\ ranges\ are\ permitted\ to\ overlap\.\)
//\ \(2\)\ If\ we're\ using\ random\ access\ iterators,\ then\ write\ the\ loop\ as
//\ a\ for\ loop\ with\ an\ explicit\ count\.
template<bool, bool, typename>
struct __copy_move
{
template<typename _II, typename _OI>
static _OI
__copy_m(_II __first, _II __last, _OI __result)
{
for (; __first != __last; ++__result, (void)++__first)
*__result = *__first;
return __result;
}
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Category>
struct __copy_move<true, false, _Category>
{
template<typename _II, typename _OI>
static _OI
__copy_m(_II __first, _II __last, _OI __result)
{
for (; __first != __last; ++__result, (void)++__first)
*__result = std::move(*__first);
return __result;
}
};
#endif
template<>
struct __copy_move<false, false, random_access_iterator_tag>
{
template<typename _II, typename _OI>
static _OI
__copy_m(_II __first, _II __last, _OI __result)
{
typedef typename iterator_traits<_II>::difference_type _Distance;
for(_Distance __n = __last - __first; __n > 0; --__n)
{
*__result = *__first;
++__first;
++__result;
}
return __result;
}
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<>
struct __copy_move<true, false, random_access_iterator_tag>
{
template<typename _II, typename _OI>
static _OI
__copy_m(_II __first, _II __last, _OI __result)
{
typedef typename iterator_traits<_II>::difference_type _Distance;
for(_Distance __n = __last - __first; __n > 0; --__n)
{
*__result = std::move(*__first);
++__first;
++__result;
}
return __result;
}
};
#endif
template<bool _IsMove>
struct __copy_move<_IsMove, true, random_access_iterator_tag>
{
template<typename _Tp>
static _Tp*
__copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
using __assignable = conditional<_IsMove,
is_move_assignable<_Tp>,
is_copy_assignable<_Tp>>;
//\ trivial\ types\ can\ have\ deleted\ assignment
static_assert( __assignable::type::value, "type is not assignable" );
#endif
const ptrdiff_t _Num = __last - __first;
if (_Num)
__builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
return __result + _Num;
}
};
template<bool _IsMove, typename _II, typename _OI>
inline _OI
__copy_move_a(_II __first, _II __last, _OI __result)
{
typedef typename iterator_traits<_II>::value_type _ValueTypeI;
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
typedef typename iterator_traits<_II>::iterator_category _Category;
const bool __simple = (__is_trivially_copyable(_ValueTypeI)
&& __is_pointer<_II>::__value
&& __is_pointer<_OI>::__value
&& __are_same<_ValueTypeI, _ValueTypeO>::__value);
return std::__copy_move<_IsMove, __simple,
_Category>::__copy_m(__first, __last, __result);
}
//\ Helpers\ for\ streambuf\ iterators\ \(either\ istream\ or\ ostream\)\.
//\ NB:\ avoid\ including\ ,\ relatively\ large\.
template<typename _CharT>
struct char_traits;
template<typename _CharT, typename _Traits>
class istreambuf_iterator;
template<typename _CharT, typename _Traits>
class ostreambuf_iterator;
template<bool _IsMove, typename _CharT>
typename __gnu_<span class="namespc">cxx</span>::__enable_if<__is_char<_CharT>::__value,
ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
__copy_move_a2(_CharT*, _CharT*,
ostreambuf_iterator<_CharT, char_traits<_CharT> >);
template<bool _IsMove, typename _CharT>
typename __gnu_<span class="namespc">cxx</span>::__enable_if<__is_char<_CharT>::__value,
ostreambuf_iterator<_CharT, char_traits<_CharT> > >::__type
__copy_move_a2(const _CharT*, const _CharT*,
ostreambuf_iterator<_CharT, char_traits<_CharT> >);
template<bool _IsMove, typename _CharT>
typename __gnu_<span class="namespc">cxx</span>::__enable_if<__is_char<_CharT>::__value,
_CharT*>::__type
__copy_move_a2(istreambuf_iterator<_CharT, char_traits<_CharT> >,
istreambuf_iterator<_CharT, char_traits<_CharT> >, _CharT*);
template<bool _IsMove, typename _II, typename _OI>
inline _OI
__copy_move_a2(_II __first, _II __last, _OI __result)
{
return std::__niter_wrap(__result,
std::__copy_move_a<_IsMove>(std::__niter_base(__first),
std::__niter_base(__last),
std::__niter_base(__result)));
}
/**
* @brief Copies the range [first,last) into result.
* @ingroup mutating_algorithms
* @param __first An input iterator.
* @param __last An input iterator.
* @param __result An output iterator.
* @return result + (first - last)
*
* This inline function will boil down to a call to @c memmove whenever
* possible. Failing that, if random access iterators are passed, then the
* loop count will be known (and therefore a candidate for compiler
* optimizations such as unrolling). Result may not be contained within
* [first,last); the copy_backward function should be used instead.
*
* Note that the end of the output range is permitted to be contained
* within [first,last).
*/
template<typename _II, typename _OI>
inline _OI
copy(_II __first, _II __last, _OI __result)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_II>)
__glibcxx_function_requires(_OutputIteratorConcept<_OI,
typename iterator_traits<_II>::value_type>)
__glibcxx_requires_can_increment_range(__first, __last, __result);
return <span class="namespc">std</span>::__copy_move_a2<__is_move_iterator<_II>::__value>
(std::__miter_base(__first), std::__miter_base(__last), __result);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Moves the range [first,last) into result.
* @ingroup mutating_algorithms
* @param __first An input iterator.
* @param __last An input iterator.
* @param __result An output iterator.
* @return result + (first - last)
*
* This inline function will boil down to a call to @c memmove whenever
* possible. Failing that, if random access iterators are passed, then the
* loop count will be known (and therefore a candidate for compiler
* optimizations such as unrolling). Result may not be contained within
* [first,last); the move_backward function should be used instead.
*
* Note that the end of the output range is permitted to be contained
* within [first,last).
*/
template<typename _II, typename _OI>
inline _OI
move(_II __first, _II __last, _OI __result)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_II>)
__glibcxx_function_requires(_OutputIteratorConcept<_OI,
typename iterator_traits<_II>::value_type>)
__glibcxx_requires_can_increment_range(__first, __last, __result);
return std::__copy_move_a2<true>(std::__miter_base(__first),
std::__miter_base(__last), __result);
}
#define _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _Vp) std::move(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::move(_Tp, _Up, _Vp)
#else
#define _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE3(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _Vp) std::copy(_Tp, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp) _GLIBCXX_MOVE3(_Tp, _Up, _Vp) std::copy(_Tp, _Up, _Vp)
#endif
template<bool, bool, typename>
struct __copy_move_backward
{
template<typename _BI1, typename _BI2>
static _BI2
__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
{
while (__first != __last)
*--__result = *--__last;
return __result;
}
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<typename _Category>
struct __copy_move_backward<true, false, _Category>
{
template<typename _BI1, typename _BI2>
static _BI2
__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
{
while (__first != __last)
*--__result = std::move(*--__last);
return __result;
}
};
#endif
template<>
struct __copy_move_backward<false, false, random_access_iterator_tag>
{
template<typename _BI1, typename _BI2>
static _BI2
__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
{
typename iterator_traits<_BI1>::difference_type __n;
for (__n = __last - __first; __n > 0; --__n)
*--__result = *--__last;
return __result;
}
};
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
template<>
struct __copy_move_backward<true, false, random_access_iterator_tag>
{
template<typename _BI1, typename _BI2>
static _BI2
__copy_move_b(_BI1 __first, _BI1 __last, _BI2 __result)
{
typename iterator_traits<_BI1>::difference_type __n;
for (__n = __last - __first; __n > 0; --__n)
*--__result = std::move(*--__last);
return __result;
}
};
#endif
template<bool _IsMove>
struct __copy_move_backward<_IsMove, true, random_access_iterator_tag>
{
template<typename _Tp>
static _Tp*
__copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
{
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
using __assignable = conditional<_IsMove,
is_move_assignable<_Tp>,
is_copy_assignable<_Tp>>;
//\ trivial\ types\ can\ have\ deleted\ assignment
static_assert( __assignable::type::value, "type is not assignable" );
#endif
const ptrdiff_t _Num = __last - __first;
if (_Num)
__builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
return __result - _Num;
}
};
template<bool _IsMove, typename _BI1, typename _BI2>
inline _BI2
__copy_move_backward_a(_BI1 __first, _BI1 __last, _BI2 __result)
{
typedef typename iterator_traits<_BI1>::value_type _ValueType1;
typedef typename iterator_traits<_BI2>::value_type _ValueType2;
typedef typename iterator_traits<_BI1>::iterator_category _Category;
const bool __simple = (__is_trivially_copyable(_ValueType1)
&& __is_pointer<_BI1>::__value
&& __is_pointer<_BI2>::__value
&& __are_same<_ValueType1, _ValueType2>::__value);
return std::__copy_move_backward<_IsMove, __simple,
_Category>::__copy_move_b(__first,
__last,
__result);
}
template<bool _IsMove, typename _BI1, typename _BI2>
inline _BI2
__copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result)
{
return std::__niter_wrap(__result,
std::__copy_move_backward_a<_IsMove>
(std::__niter_base(__first), std::__niter_base(__last),
std::__niter_base(__result)));
}
/**
* @brief Copies the range [first,last) into result.
* @ingroup mutating_algorithms
* @param __first A bidirectional iterator.
* @param __last A bidirectional iterator.
* @param __result A bidirectional iterator.
* @return result - (first - last)
*
* The function has the same effect as copy, but starts at the end of the
* range and works its way to the start, returning the start of the result.
* This inline function will boil down to a call to @c memmove whenever
* possible. Failing that, if random access iterators are passed, then the
* loop count will be known (and therefore a candidate for compiler
* optimizations such as unrolling).
*
* Result may not be in the range (first,last]. Use copy instead. Note
* that the start of the output range may overlap [first,last).
*/
template<typename _BI1, typename _BI2>
inline _BI2
copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
{
//\ concept\ requirements
__glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
__glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
__glibcxx_function_requires(_ConvertibleConcept<
typename iterator_traits<_BI1>::value_type,
typename iterator_traits<_BI2>::value_type>)
__glibcxx_requires_can_decrement_range(__first, __last, __result);
return <span class="namespc">std</span>::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
(std::__miter_base(__first), std::__miter_base(__last), __result);
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
/**
* @brief Moves the range [first,last) into result.
* @ingroup mutating_algorithms
* @param __first A bidirectional iterator.
* @param __last A bidirectional iterator.
* @param __result A bidirectional iterator.
* @return result - (first - last)
*
* The function has the same effect as move, but starts at the end of the
* range and works its way to the start, returning the start of the result.
* This inline function will boil down to a call to @c memmove whenever
* possible. Failing that, if random access iterators are passed, then the
* loop count will be known (and therefore a candidate for compiler
* optimizations such as unrolling).
*
* Result may not be in the range (first,last]. Use move instead. Note
* that the start of the output range may overlap [first,last).
*/
template<typename _BI1, typename _BI2>
inline _BI2
move_backward(_BI1 __first, _BI1 __last, _BI2 __result)
{
//\ concept\ requirements
__glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
__glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
__glibcxx_function_requires(_ConvertibleConcept<
typename iterator_traits<_BI1>::value_type,
typename iterator_traits<_BI2>::value_type>)
__glibcxx_requires_can_decrement_range(__first, __last, __result);
return std::__copy_move_backward_a2<true>(std::__miter_base(__first),
std::__miter_base(__last),
__result);
}
#define _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _Vp) std::move_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::move_backward(_Tp, _Up, _Vp)
#else
#define _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _Vp) std::copy_backward(_Tp, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp) _GLIBCXX_MOVE_BACKWARD3(_Tp, _Up, _Vp) std::copy_backward(_Tp, _Up, _Vp)
#endif
template<typename _ForwardIterator, typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>!<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>v<span class="namespc"></span>o<span class="namespc"></span>i<span class="namespc"></span>d<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
for (; __first != __last; ++__first)
*__first = __value;
}
template<typename _ForwardIterator, typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>v<span class="namespc"></span>o<span class="namespc"></span>i<span class="namespc"></span>d<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
const _Tp __tmp = __value;
for (; __first != __last; ++__first)
*__first = __tmp;
}
//\ Specialization:\ for\ char\ types\ we\ can\ use\ memset\.
template<typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>b<span class="namespc"></span>y<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>v<span class="namespc"></span>o<span class="namespc"></span>i<span class="namespc"></span>d<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_a(_Tp* __first, _Tp* __last, const _Tp& __c)
{
const _Tp __tmp = __c;
if (const size_t __len = __last - __first)
__builtin_memset(__first, static_cast<unsigned char>(__tmp), __len);
}
/**
* @brief Fills the range [first,last) with copies of value.
* @ingroup mutating_algorithms
* @param __first A forward iterator.
* @param __last A forward iterator.
* @param __value A reference-to-const of arbitrary type.
* @return Nothing.
*
* This function fills a range with copies of the same value. For char
* types filling contiguous areas of memory, this becomes an inline call
* to @c memset or @c wmemset.
*/
template<typename _ForwardIterator, typename _Tp>
inline void
fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
{
//\ concept\ requirements
__glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
_ForwardIterator>)
__glibcxx_requires_valid_range(__first, __last);
std::__fill_a(std::__niter_base(__first), std::__niter_base(__last),
__value);
}
template<typename _OutputIterator, typename _Size, typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>!<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>O<span class="namespc"></span>u<span class="namespc"></span>t<span class="namespc"></span>p<span class="namespc"></span>u<span class="namespc"></span>t<span class="namespc"></span>I<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
{
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, (void) ++__first)
*__first = __value;
return __first;
}
template<typename _OutputIterator, typename _Size, typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>s<span class="namespc"></span>c<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>r<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>O<span class="namespc"></span>u<span class="namespc"></span>t<span class="namespc"></span>p<span class="namespc"></span>u<span class="namespc"></span>t<span class="namespc"></span>I<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span>r<span class="namespc"></span>a<span class="namespc"></span>t<span class="namespc"></span>o<span class="namespc"></span>r<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
{
const _Tp __tmp = __value;
for (__decltype(__n + 0) __niter = __n;
__niter > 0; --__niter, (void) ++__first)
*__first = __tmp;
return __first;
}
template<typename _Size, typename _Tp>
inline typename
<span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>g<span class="namespc"></span>n<span class="namespc"></span>u<span class="namespc"></span>_<span class="namespc"></span><<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span> <span class="namespc"></span>c<span class="namespc"></span>l<span class="namespc"></span>a<span class="namespc"></span>s<span class="namespc"></span>s<span class="namespc"></span>=<span class="namespc"></span>"<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>m<span class="namespc"></span>e<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>c<span class="namespc"></span>"<span class="namespc"></span>><span class="namespc"></span>c<span class="namespc"></span>x<span class="namespc"></span>x<span class="namespc"></span><<span class="namespc"></span>/<span class="namespc"></span>s<span class="namespc"></span>p<span class="namespc"></span>a<span class="namespc"></span>n<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>e<span class="namespc"></span>n<span class="namespc"></span>a<span class="namespc"></span>b<span class="namespc"></span>l<span class="namespc"></span>e<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>f<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>b<span class="namespc"></span>y<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>,<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>T<span class="namespc"></span>p<span class="namespc"></span>*<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>t<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
__fill_n_a(_Tp* __first, _Size __n, const _Tp& __c)
{
std::__fill_a(__first, __first + __n, __c);
return __first + __n;
}
/**
* @brief Fills the range [first,first+n) with copies of value.
* @ingroup mutating_algorithms
* @param __first An output iterator.
* @param __n The count of copies to perform.
* @param __value A reference-to-const of arbitrary type.
* @return The iterator at first+n.
*
* This function fills a range with copies of the same value. For char
* types filling contiguous areas of memory, this becomes an inline call
* to @c memset or @ wmemset.
*
* _GLIBCXX_RESOLVE_LIB_DEFECTS
* DR 865. More algorithms that throw away information
*/
template<typename _OI, typename _Size, typename _Tp>
inline _OI
fill_n(_OI __first, _Size __n, const _Tp& __value)
{
//\ concept\ requirements
__glibcxx_function_requires(_OutputIteratorConcept<_OI, _Tp>)
__glibcxx_requires_can_increment(__first, __n);
return std::__niter_wrap(__first,
std::__fill_n_a(std::__niter_base(__first), __n, __value));
}
template<bool _BoolType>
struct __equal
{
template<typename _II1, typename _II2>
static bool
equal(_II1 __first1, _II1 __last1, _II2 __first2)
{
for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!(*__first1 == *__first2))
return false;
return true;
}
};
template<>
struct __equal<true>
{
template<typename _Tp>
static bool
equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
{
if (const size_t __len = (__last1 - __first1))
return !__builtin_memcmp(__first1, __first2, sizeof(_Tp) * __len);
return true;
}
};
template<typename _II1, typename _II2>
inline bool
__equal_aux(_II1 __first1, _II1 __last1, _II2 __first2)
{
typedef typename iterator_traits<_II1>::value_type _ValueType1;
typedef typename iterator_traits<_II2>::value_type _ValueType2;
const bool __simple = ((__is_integer<_ValueType1>::__value
|| __is_pointer<_ValueType1>::__value)
&& __is_pointer<_II1>::__value
&& __is_pointer<_II2>::__value
&& __are_same<_ValueType1, _ValueType2>::__value);
return <span class="namespc">std</span>::__equal<__simple>::equal(__first1, __last1, __first2);
}
template<typename, typename>
struct __lc_rai
{
template<typename _II1, typename _II2>
static _II1
__newlast1(_II1, _II1 __last1, _II2, _II2)
{ return __last1; }
template<typename _II>
static bool
__cnd2(_II __first, _II __last)
{ return __first != __last; }
};
template<>
struct __lc_rai
{
template<typename _RAI1, typename _RAI2>
static _RAI1
__newlast1(_RAI1 __first1, _RAI1 __last1,
_RAI2 __first2, _RAI2 __last2)
{
const typename iterator_traits<_RAI1>::difference_type
__diff1 = __last1 - __first1;
const typename iterator_traits<_RAI2>::difference_type
__diff2 = __last2 - __first2;
return __diff2 < __diff1 ? __first1 + __diff2 : __last1;
}
template<typename _RAI>
static bool
__cnd2(_RAI, _RAI)
{ return true; }
};
template<typename _II1, typename _II2, typename _Compare>
bool
__lexicographical_compare_impl(_II1 __first1, _II1 __last1,
_II2 __first2, _II2 __last2,
_Compare __comp)
{
typedef typename iterator_traits<_II1>::iterator_category _Category1;
typedef typename iterator_traits<_II2>::iterator_category _Category2;
typedef std::__lc_rai<_Category1, _Category2> __rai_type;
__last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
++__first1, (void)++__first2)
{
if (__comp(__first1, __first2))
return true;
if (__comp(__first2, __first1))
return false;
}
return __first1 == __last1 && __first2 != __last2;
}
template<bool _BoolType>
struct __lexicographical_compare
{
template<typename _II1, typename _II2>
static bool __lc(_II1, _II1, _II2, _II2);
};
template<bool _BoolType>
template<typename _II1, typename _II2>
bool
__lexicographical_compare<_BoolType>::
__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
{
return std::__lexicographical_compare_impl(__first1, __last1,
__first2, __last2,
__gnu_cxx::__ops::__iter_less_iter());
}
template<>
struct __lexicographical_compare<true>
{
template<typename _Tp, typename _Up>
static bool
__lc(const _Tp* __first1, const _Tp* __last1,
const _Up* __first2, const _Up* __last2)
{
const size_t __len1 = __last1 - __first1;
const size_t __len2 = __last2 - __first2;
if (const size_t __len = std::min(__len1, __len2))
if (int __result = __builtin_memcmp(__first1, __first2, __len))
return __result < 0;
return __len1 < __len2;
}
};
template<typename _II1, typename _II2>
inline bool
__lexicographical_compare_aux(_II1 __first1, _II1 __last1,
_II2 __first2, _II2 __last2)
{
typedef typename iterator_traits<_II1>::value_type _ValueType1;
typedef typename iterator_traits<_II2>::value_type _ValueType2;
const bool __simple =
<span class="namespc"></span> <span class="namespc"></span>(<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>b<span class="namespc"></span>y<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>1<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>&<span class="namespc"></span>&<span class="namespc"></span> <span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>i<span class="namespc"></span>s<span class="namespc"></span>_<span class="namespc"></span>b<span class="namespc"></span>y<span class="namespc"></span>t<span class="namespc"></span>e<span class="namespc"></span><<span class="namespc"></span>_<span class="namespc"></span>V<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span>T<span class="namespc"></span>y<span class="namespc"></span>p<span class="namespc"></span>e<span class="namespc"></span>2<span class="namespc"></span>><span class="namespc"></span>:<span class="namespc"></span>:<span class="namespc"></span>_<span class="namespc"></span>_<span class="namespc"></span>v<span class="namespc"></span>a<span class="namespc"></span>l<span class="namespc"></span>u<span class="namespc"></span>e<span class="namespc"></span> <span class="namespc"></span>
&& !__gnu_<span class="namespc">cxx</span>::__numeric_traits<_ValueType1>::__is_signed
&& !__gnu_<span class="namespc">cxx</span>::__numeric_traits<_ValueType2>::__is_signed
&& __is_pointer<_II1>::__value
&& __is_pointer<_II2>::__value);
return <span class="namespc">std</span>::__lexicographical_compare<__simple>::__lc(__first1, __last1,
__first2, __last2);
}
template<typename _ForwardIterator, typename _Tp, typename _Compare>
_ForwardIterator
__lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val, _Compare __comp)
{
typedef typename iterator_traits<_ForwardIterator>::difference_type
_DistanceType;
_DistanceType __len = std::distance(__first, __last);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__comp(__middle, __val))
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else
__len = __half;
}
return __first;
}
/**
* @brief Finds the first position in which @a val could be inserted
* without changing the ordering.
* @param __first An iterator.
* @param __last Another iterator.
* @param __val The search term.
* @return An iterator pointing to the first element not less
* than @a val, or end() if every element is less than
* @a val.
* @ingroup binary_search_algorithms
*/
template<typename _ForwardIterator, typename _Tp>
inline _ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val)
{
//\ concept\ requirements
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
__glibcxx_function_requires(_LessThanOpConcept<
typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
__glibcxx_requires_partitioned_lower(__first, __last, __val);
return std::__lower_bound(__first, __last, __val,
__gnu_cxx::__ops::__iter_less_val());
}
///\ This\ is\ a\ helper\ function\ for\ the\ sort\ routines\ and\ for\ random\.tcc\.
//\ \ Precondition:\ __n\ >\ 0\.
inline _GLIBCXX_CONSTEXPR int
__lg(int __n)
{ return (int)sizeof(int) * __CHAR_BIT__ - 1 - __builtin_clz(__n); }
inline _GLIBCXX_CONSTEXPR unsigned
__lg(unsigned __n)
{ return (int)sizeof(int) * __CHAR_BIT__ - 1 - __builtin_clz(__n); }
inline _GLIBCXX_CONSTEXPR long
__lg(long __n)
{ return (int)sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
inline _GLIBCXX_CONSTEXPR unsigned long
__lg(unsigned long __n)
{ return (int)sizeof(long) * __CHAR_BIT__ - 1 - __builtin_clzl(__n); }
inline _GLIBCXX_CONSTEXPR long long
__lg(long long __n)
{ return (int)sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
inline _GLIBCXX_CONSTEXPR unsigned long long
__lg(unsigned long long __n)
{ return (int)sizeof(long long) * __CHAR_BIT__ - 1 - __builtin_clzll(__n); }
_GLIBCXX_BEGIN_NAMESPACE_ALGO
/**
* @brief Tests a range for element-wise equality.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @return A boolean true or false.
*
* This compares the elements of two ranges using @c == and returns true or
* false depending on whether all of the corresponding elements of the
* ranges are equal.
*/
template<typename _II1, typename _II2>
inline bool
equal(_II1 __first1, _II1 __last1, _II2 __first2)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_II1>)
__glibcxx_function_requires(_InputIteratorConcept<_II2>)
__glibcxx_function_requires(_EqualOpConcept<
typename iterator_traits<_II1>::value_type,
typename iterator_traits<_II2>::value_type>)
__glibcxx_requires_can_increment_range(__first1, __last1, __first2);
return std::__equal_aux(std::__niter_base(__first1),
std::__niter_base(__last1),
std::__niter_base(__first2));
}
/**
* @brief Tests a range for element-wise equality.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __binary_pred A binary predicate @link functors
* functor@endlink.
* @return A boolean true or false.
*
* This compares the elements of two ranges using the binary_pred
* parameter, and returns true or
* false depending on whether all of the corresponding elements of the
* ranges are equal.
*/
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
inline bool
equal(_IIter1 __first1, _IIter1 __last1,
_IIter2 __first2, _BinaryPredicate __binary_pred)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_IIter1>)
__glibcxx_function_requires(_InputIteratorConcept<_IIter2>)
__glibcxx_requires_valid_range(__first1, __last1);
for (; __first1 != __last1; ++__first1, (void)++__first2)
if (!bool(__binary_pred(*__first1, *__first2)))
return false;
return true;
}
#if __cplusplus __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L __cplusplus >= __cplusplus >= 201103L __cplusplus >= 201103L
//\ 4\-iterator\ version\ of\ std::equal\ for\ use\ in\ C11\.
template<typename _II1, typename _II2>
inline bool
__equal4(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
{
using _RATag = random_access_iterator_tag;
using _Cat1 = typename iterator_traits<_II1>::iterator_category;
using _Cat2 = typename iterator_traits<_II2>::iterator_category;
using _RAIters = __and_, is_same<_Cat2, _RATag>>;
if (_RAIters())
{
auto __d1 = std::distance(__first1, __last1);
auto __d2 = std::distance(__first2, __last2);
if (__d1 != __d2)
return false;
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2);
}
for (; __first1 != __last1 && __first2 != __last2;
++__first1, (void)++__first2)
if (!(*__first1 == *__first2))
return false;
return __first1 == __last1 && __first2 == __last2;
}
//\ 4\-iterator\ version\ of\ std::equal\ for\ use\ in\ C11\.
template<typename _II1, typename _II2, typename _BinaryPredicate>
inline bool
__equal4(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2,
_BinaryPredicate __binary_pred)
{
using _RATag = random_access_iterator_tag;
using _Cat1 = typename iterator_traits<_II1>::iterator_category;
using _Cat2 = typename iterator_traits<_II2>::iterator_category;
using _RAIters = __and_, is_same<_Cat2, _RATag>>;
if (_RAIters())
{
auto __d1 = std::distance(__first1, __last1);
auto __d2 = std::distance(__first2, __last2);
if (__d1 != __d2)
return false;
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2,
__binary_pred);
}
for (; __first1 != __last1 && __first2 != __last2;
++__first1, (void)++__first2)
if (!bool(__binary_pred(*__first1, *__first2)))
return false;
return __first1 == __last1 && __first2 == __last2;
}
#endif // //\ C11 //\ C11
__cplusplus > __cplusplus > 201103L #if__cplusplus > __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus __cplusplus > __cplusplus > 201103L __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus > 201103L
#define __cpp_lib_robust_nonmodifying_seq_ops __cpp_lib_robust_nonmodifying_seq_ops 201304 __cpp_lib_robust_nonmodifying_seq_ops 201304
/**
* @brief Tests a range for element-wise equality.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @return A boolean true or false.
*
* This compares the elements of two ranges using @c == and returns true or
* false depending on whether all of the corresponding elements of the
* ranges are equal.
*/
template<typename _II1, typename _II2>
inline bool
equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_II1>)
__glibcxx_function_requires(_InputIteratorConcept<_II2>)
__glibcxx_function_requires(_EqualOpConcept<
typename iterator_traits<_II1>::value_type,
typename iterator_traits<_II2>::value_type>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return _GLIBCXX_STD_A::__equal4(__first1, __last1, __first2, __last2);
}
/**
* @brief Tests a range for element-wise equality.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @param __binary_pred A binary predicate @link functors
* functor@endlink.
* @return A boolean true or false.
*
* This compares the elements of two ranges using the binary_pred
* parameter, and returns true or
* false depending on whether all of the corresponding elements of the
* ranges are equal.
*/
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
inline bool
equal(_IIter1 __first1, _IIter1 __last1,
_IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_IIter1>)
__glibcxx_function_requires(_InputIteratorConcept<_IIter2>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return _GLIBCXX_STD_A::__equal4(__first1, __last1, __first2, __last2,
__binary_pred);
}
#endif // //\ C14 //\ C14
/**
* @brief Performs @b dictionary comparison on ranges.
* @ingroup sorting_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @return A boolean true or false.
*
* Returns true if the sequence of elements defined by the range
* [first1,last1) is lexicographically less than the sequence of elements
* defined by the range [first2,last2). Returns false otherwise.
* (Quoted from [25.3.8]/1.) If the iterators are all character pointers,
* then this is an inline call to @c memcmp.
*/
template<typename _II1, typename _II2>
inline bool
lexicographical_compare(_II1 __first1, _II1 __last1,
_II2 __first2, _II2 __last2)
{
#ifdef _GLIBCXX_CONCEPT_CHECKS
//\ concept\ requirements
typedef typename iterator_traits<_II1>::value_type _ValueType1;
typedef typename iterator_traits<_II2>::value_type _ValueType2;
#endif
__glibcxx_function_requires(_InputIteratorConcept<_II1>)
__glibcxx_function_requires(_InputIteratorConcept<_II2>)
__glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
__glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return std::__lexicographical_compare_aux(std::__niter_base(__first1),
std::__niter_base(__last1),
std::__niter_base(__first2),
std::__niter_base(__last2));
}
/**
* @brief Performs @b dictionary comparison on ranges.
* @ingroup sorting_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @param __comp A @link comparison_functors comparison functor@endlink.
* @return A boolean true or false.
*
* The same as the four-parameter @c lexicographical_compare, but uses the
* comp parameter instead of @c <.
*/
template<typename _II1, typename _II2, typename _Compare>
inline bool
lexicographical_compare(_II1 __first1, _II1 __last1,
_II2 __first2, _II2 __last2, _Compare __comp)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_II1>)
__glibcxx_function_requires(_InputIteratorConcept<_II2>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return std::__lexicographical_compare_impl
(__first1, __last1, __first2, __last2,
__gnu_cxx::__ops::__iter_comp_iter(__comp));
}
template<typename _InputIterator1, typename _InputIterator2,
typename _BinaryPredicate>
pair<_InputIterator1, _InputIterator2>
__mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _BinaryPredicate __binary_pred)
{
while (__first1 != __last1 && __binary_pred(__first1, __first2))
{
++__first1;
++__first2;
}
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
}
/**
* @brief Finds the places in ranges which don't match.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @return A pair of iterators pointing to the first mismatch.
*
* This compares the elements of two ranges using @c == and returns a pair
* of iterators. The first iterator points into the first range, the
* second iterator points into the second range, and the elements pointed
* to by the iterators are not equal.
*/
template<typename _InputIterator1, typename _InputIterator2>
inline pair<_InputIterator1, _InputIterator2>
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
__glibcxx_function_requires(_EqualOpConcept<
typename iterator_traits<_InputIterator1>::value_type,
typename iterator_traits<_InputIterator2>::value_type>)
__glibcxx_requires_valid_range(__first1, __last1);
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
__gnu_cxx::__ops::__iter_equal_to_iter());
}
/**
* @brief Finds the places in ranges which don't match.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __binary_pred A binary predicate @link functors
* functor@endlink.
* @return A pair of iterators pointing to the first mismatch.
*
* This compares the elements of two ranges using the binary_pred
* parameter, and returns a pair
* of iterators. The first iterator points into the first range, the
* second iterator points into the second range, and the elements pointed
* to by the iterators are not equal.
*/
template<typename _InputIterator1, typename _InputIterator2,
typename _BinaryPredicate>
inline pair<_InputIterator1, _InputIterator2>
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _BinaryPredicate __binary_pred)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
__glibcxx_requires_valid_range(__first1, __last1);
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
}
__cplusplus > __cplusplus > 201103L #if__cplusplus > __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus __cplusplus > __cplusplus > 201103L __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus > __cplusplus > 201103L __cplusplus > 201103L
template<typename _InputIterator1, typename _InputIterator2,
typename _BinaryPredicate>
pair<_InputIterator1, _InputIterator2>
__mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_BinaryPredicate __binary_pred)
{
while (__first1 != __last1 && __first2 != __last2
&& __binary_pred(__first1, __first2))
{
++__first1;
++__first2;
}
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
}
/**
* @brief Finds the places in ranges which don't match.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @return A pair of iterators pointing to the first mismatch.
*
* This compares the elements of two ranges using @c == and returns a pair
* of iterators. The first iterator points into the first range, the
* second iterator points into the second range, and the elements pointed
* to by the iterators are not equal.
*/
template<typename _InputIterator1, typename _InputIterator2>
inline pair<_InputIterator1, _InputIterator2>
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
__glibcxx_function_requires(_EqualOpConcept<
typename iterator_traits<_InputIterator1>::value_type,
typename iterator_traits<_InputIterator2>::value_type>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
__gnu_cxx::__ops::__iter_equal_to_iter());
}
/**
* @brief Finds the places in ranges which don't match.
* @ingroup non_mutating_algorithms
* @param __first1 An input iterator.
* @param __last1 An input iterator.
* @param __first2 An input iterator.
* @param __last2 An input iterator.
* @param __binary_pred A binary predicate @link functors
* functor@endlink.
* @return A pair of iterators pointing to the first mismatch.
*
* This compares the elements of two ranges using the binary_pred
* parameter, and returns a pair
* of iterators. The first iterator points into the first range, the
* second iterator points into the second range, and the elements pointed
* to by the iterators are not equal.
*/
template<typename _InputIterator1, typename _InputIterator2,
typename _BinaryPredicate>
inline pair<_InputIterator1, _InputIterator2>
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2,
_BinaryPredicate __binary_pred)
{
//\ concept\ requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
__glibcxx_requires_valid_range(__first1, __last1);
__glibcxx_requires_valid_range(__first2, __last2);
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
}
#endif
_GLIBCXX_END_NAMESPACE_ALGO
_GLIBCXX_END_NAMESPACE_VERSION
} //\ namespace\ std
//\ NB:\ This\ file\ is\ included\ within\ many\ other\ C\ includes,\ as\ a\ way
//\ of\ getting\ the\ base\ algorithms\.\ So,\ make\ sure\ that\ parallel\ bits
//\ come\ in\ too\ if\ requested\.
#ifdef _GLIBCXX_PARALLEL
# include include include
#endif
#endif